1

我有一个项目结构如下。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 并且作为结果它错过了存档步骤,我的存档永远不会更新。

这个问题有解决方案吗?我已经阅读了这个链接并且没有太大帮助。

4

2 回答 2

0

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

相反,您应该使用add_custom_command打包并将该命令DEPENDS用于构建的目标B.exe和自定义目标的输出文件C

于 2015-01-22T09:15:53.770 回答
0

我是 CMake 的新手,并且在 exec 没有被重建时遇到了类似的问题。我分享我的解决方案,希望这对未来的读者有所帮助。

注意:以下解决方案是使用带有新内置 CMake 支持的 VS 2017 测试的,因此不会生成任何解决方案。仅加载找到顶级 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 或 Ah 中的代码时,它都会重新构建库和 exec。也许不是最优雅但有效的解决方案。

于 2018-05-21T10:14:04.643 回答