cmake可执行文件没有重建

时间:2015-01-21 21:58:09

标签: build cmake post-build-event rebuild post-build

我的项目结构如下。 A.dll依赖于B.exe,B.exe依赖于自定义目标C.自定义目标C生成一些文件,其中B.exe在归档中打包为目标B上的后期构建步骤。
当我第一次构建A.dll时,因为它是第一次构建B.exe并且作为构建后步骤myArchieve.a构建。从那时起,如果我构建A.dll,则B.exe不会重建,因为它是可执行文件,并且由于之前的构建而存在。由此产生的问题是:
1。我总是有一个陈旧的可执行文件
2。如果我对C进行了一些更改并触发了A.dll的构建,那么cmake只会重建C和A.它不会重建B.exe,因此它错过了最后的步骤而且我的archieve永远不会更新。

这个问题有解决方法吗?我已经阅读了this链接,并没有多大帮助。

2 个答案:

答案 0 :(得分:0)

您的设置存在概念性问题:打包不应该是构建后的步骤。

相反,您应该使用add_custom_command进行打包,并在构建DEPENDS的目标和自定义目标B.exe的输出文件上使用该命令C。< / p>

答案 1 :(得分:0)

我是CMake的新手,并且有一个类似的问题,exec没有被重建。我希望这对我未来的读者有所帮助。

注意:以下解决方案使用VS 2017和新的内置CMake支持进行了测试,因此未生成任何解决方案。只有文件夹被加载到找到顶级CMakeLists.txt的位置。

文件夹结构为:

.
└── A
    ├── B
    │   └── main.cpp
    ├── A.cpp
    └── A.h

您可以为B创建一个子文件夹:

# Content of "B/CMakeLists.txt"
project(B)

add_executable( BExec main.cpp)
add_custom_command(TARGET BExec 
                   PRE_BUILD
                   COMMAND cmake -E cmake_autogen ${PROJECT_BINARY_DIR}/CMakeFiles/BExec_autogen.dir Debug)

然后你可以在A:

中做到以下几点
# Content of CMakeLists.txt for A
project(A)
add_subdirectory(B)

add_library(A A.cpp A.h)
add_dependencies(A BExec)

每次更改main.cpp,A.cpp或A.h中的代码时,它都会重建库和exec。也许不是最优雅但最有效的解决方案。