Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Build cmake可执行文件不';我们不能重建_Build_Cmake_Post Build Event_Rebuild_Post Build - Fatal编程技术网

Build cmake可执行文件不';我们不能重建

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,B.exe依赖于自定义目标C。自定义目标C生成一些文件,B.exe将这些文件打包到存档中,作为目标B上的后期生成步骤。
当我第一次构建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”没有被任何目标用作源。因此,不会在任何目标上添加此自定义命令。