Build cmake可执行文件不';我们不能重建
我有一个项目结构如下。A.dll依赖于B.exe,B.exe依赖于自定义目标C。自定义目标C生成一些文件,B.exe将这些文件打包到存档中,作为目标B上的后期生成步骤。Build cmake可执行文件不';我们不能重建,build,cmake,post-build-event,rebuild,post-build,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就不会被重建,因为它是一个可执行文件,并且由于以前的构建而存在。由此产生的问题有: 一,。我总是有一个过时的可执行文件 二,。如果我对C做了一些更改并触发了a.dll的构
当我第一次构建A.dll时,因为这是第一次构建B.exe,并且作为构建后的一个步骤,myArchieve.A被构建。从那时起,如果我构建了A.dll,B.exe就不会被重建,因为它是一个可执行文件,并且由于以前的构建而存在。由此产生的问题有:
一,。我总是有一个过时的可执行文件
二,。如果我对C做了一些更改并触发了a.dll的构建,cmake只会重建C和a。它不会重建B.exe,因此它错过了archieve步骤,并且我的archieve从未得到更新
这个问题有解决办法吗?我已经阅读了链接,但没有多大帮助。您的设置存在一个概念上的问题:打包不应该是构建后的步骤
相反,您应该使用该命令进行打包,并使该命令
依赖于生成B.exe
的目标和自定义目标C
的输出文件。我对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)
然后你可以在一个
# 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。可能不是最优雅的解决方案,但很有效。这不起作用,因为add_custom_命令的文档清楚地说明,自定义命令作为规则提供给使用其输出文件作为源文件的目标。我的输出,即“myArchieve.a”没有被任何目标用作源。因此,不会在任何目标上添加此自定义命令。