我的项目结构如下。 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链接,并没有多大帮助。
答案 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。也许不是最优雅但最有效的解决方案。