CMake install TARGETS 给定的目标不是可执行文件、库或模块

标签 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,这样它就不会与应该生成的目标名称冲突文件:

#!/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 .. && 打包

我得到关于file INSTALL cannot find program的错误消息

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

最佳答案

@tsyvarev 的回答为您指明了正确的方向,您编辑的问题几乎是正确的。您遗漏了add_custom_target()ALL 选项,这就是默认情况下未构建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)

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

关于CMake install TARGETS 给定的目标不是可执行文件、库或模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44210115/

相关文章:

c++ - 在 cmake : Linux 中使用 CPack 生成两个不同的包

c++ - 如何使用 CMake 从版本控制中可移植地获取仅 header 库?

cmake - 如何使用 CMAKE 在 deb 中添加变更日志?

cmake - CPack WIX 在安装树之外安装一个文件

java - Ubuntu DEB 安装程序使所有 Java 应用程序具有相同的图标

linux - 无法在 Debian GNU/Linux 8.7 下找到特定的包

windows - 使用 CMake + CPack + Wix 生成安装程序

c++ - CMake:如何从并行目录链接库

visual-studio-2008 - CMake:如何排除给定构建配置的目录?

c++ - 如何在 CmakeList 中导入 Qtquickcontrol