如何在CMake中强制目标构建的顺序

如何在CMake中强制目标构建的顺序,cmake,Cmake,我刚刚继承了一大堆用CMake构建的项目。我没有CMake知识,我怀疑之前的维护人员也有同样的知识 我需要在项目之间强制构建顺序。过去是: === BUILD TARGET foo1 OF PROJECT bar ... === BUILD TARGET foo2 OF PROJECT bar ... === BUILD TARGET foo3 OF PROJECT bar ... 我必须添加一个项目和依赖项(在不同的目标中,而不是上面的目标中)。但代码中充满了错误 # don't chang

我刚刚继承了一大堆用CMake构建的项目。我没有CMake知识,我怀疑之前的维护人员也有同样的知识

我需要在项目之间强制构建顺序。过去是:

=== BUILD TARGET foo1 OF PROJECT bar ...
=== BUILD TARGET foo2 OF PROJECT bar ...
=== BUILD TARGET foo3 OF PROJECT bar ...
我必须添加一个项目和依赖项(在不同的目标中,而不是上面的目标中)。但代码中充满了错误

# don't change the library order, it will break xyz  
target_link_libraries(foo3 other1 foo2 other2 foo1 other3)
你可以猜到,在我改变之后,我现在

=== BUILD TARGET foo1 OF PROJECT bar ...
=== BUILD TARGET foo3 OF PROJECT bar ...
foo3
由于
foo2
头未被复制/安装/其他原因而无法生成。我很确定,如果我能在
foo3
之前强制CMake触发
foo2
,问题就会得到解决

然而,我试着:

target_link_libraries(foo3 foo2)
无济于事。我仍然看到
foo3
foo2
之前触发

我也试过了

add_dependencies(foo3 foo2)
所以,我的问题是:

  • 我可以看到CMake必须在内部构建的依赖关系图吗
  • 如果某个地方碰巧有一个循环,我怎么知道并找到它呢
  • 我可以强制目标构建的顺序吗
  • 关于建造顺序还有其他问题吗

CMake是一个声明性构建系统

当您在CMakeLists.txt文件中编写的cmake程序执行时,它构建的构建系统是声明性的

这意味着您无法控制目标的构建顺序。您可以指定要完成的内容,但不能指定如何完成。那是抽象的

唯一的方法是在目标中添加依赖项。首先,在生成依赖目标之前,先生成所有依赖目标


您可以通过“target\u link\u libraries”和“target\u sources”等命令添加依赖项。您可以使用非常通用的“添加依赖项”来添加更多与基本C/C++编程无关的文件。

调用
add\u dependencies(foo3 foo2)
应该强制
foo2
目标在
foo3
之前构建。至少,如果您没有反向依赖,这是正确的。调用
target\u link\u库(foo3-foo2)
也应该可以工作。“我可以看到CMake必须在内部构建的依赖关系图吗?”-CMake只为构建工具生成文件(例如Makefile)。从您使用的构建工具请求依赖关系图。“我可以强制目标构建的顺序吗?”-除了依赖项(直接或间接),我不知道其他方法。显示如何获取依赖关系图。要调试实际的依赖项,请尝试从干净的生成树中分别生成每个目标。@这是非常棒的第一步。这个图表肯定会有帮助!同时检查并修复由
cmake-Wdev产生的任何警告