CMake安装TARGETS给定的目标,它不是可执行文件,库或模块

时间:2017-05-26 21:06:42

标签: cmake deb cpack

我正在尝试构建一个包含单个bash脚本的debian包。该脚本由以下人员生成:

go.sh

#!/bin/bash

cat >main <<EOF
#!/bin/bash
echo $@
EOF

chmod +x main

和我的CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

add_custom_command(OUTPUT main ${CMAKE_CURRENT_SOURCE_DIR}/go.sh ${PROJECT_NAME})

add_custom_target(main ALL)

install(
    TARGETS main
    DESTINATION /usr/local/lib/
)

set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Me")

include(CPack)

这只是给我一个神秘的错误信息:

CMake Error at CMakeLists.txt:7 (install):
  install TARGETS given target "main" which is not an executable, library, or
  module.

是否有人知道此错误消息的含义,以及我应该怎么做?

编辑 - 我迷失了。

我已将go.sh生成的脚本重命名为program,以便它不会与应该生成该文件的目标名称冲突:< / p>

#!/bin/bash

MAIN=program

cat >$MAIN <<EOF
#!/bin/bash
echo $@
EOF

chmod 'x $MAIN

我还更改了我的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.5)

add_custom_target(
    main
    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/program
)

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/program
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/go.sh ${PROJECT_NAME}
)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/program DESTINATION /usr/local/lib/)

set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Me")

include(CPack)

但是,我的构建仍然无法正常工作。在这种情况下,我的main目标无法构建。如果我跑:

rm -rf ./* && cmake .. && make package

我收到有关file INSTALL cannot find program

的错误消息

我认为我从根本上误解了文件和目标之间的区别。我无法想象,使用cmake,一个人应该为每个生成的文件命名,然后为每个生成的文件提供一个不同的目标名称,以避开命名冲突。这对我没有任何意义。

3 个答案:

答案 0 :(得分:1)

命令流install(TARGETS)仅适用于使用add_executable()add_library()创建的目标。

对于使用自定义目标构建的文件,请使用install(FILES)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/main DESTINATION /usr/local/lib/)

答案 1 :(得分:1)

@ tsyvarev的回答指出了你正确的方向,你编辑的问题几乎是正确的。您遗漏了add_custom_target() main选项,这就是为什么您的CMakeLists.txt目标默认情况下无法构建的原因。更正您的cmake_minimum_required(VERSION 3.5) add_custom_target( main ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/program ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/program COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/go.sh ${PROJECT_NAME} ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/program DESTINATION /usr/local/lib/) set(CPACK_GENERATOR "DEB") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Me") include(CPack) 文件以解决此问题,以下内容应符合您的要求:

    var myMessage = new SendGridMessage();
        myMessage.AddTo(message.Destination);
        myMessage.From = new MailAddress("you@somewhere.com", "My name");//here the error Happens
        myMessage.Subject = message.Subject;
        myMessage.PlainTextContent = message.Body;
        myMessage.HtmlContent= message.Body;

这是一个非常标准的CMake模式,有一个自定义命令创建一个文件,一个自定义目标依赖它,以便可以根据需要触发它。

答案 2 :(得分:0)

修正了它。我不得不将add_custom_command折叠到add_custom_target

cmake_minimum_required(VERSION 3.5)

add_custom_target(
    main ALL
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/go.sh ${PROJECT_NAME}
)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/main DESTINATION /usr/local/bin/)

set(CPACK_GENERATOR "DEB")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Me")

include(CPack)