CMake 的依赖关系图

引出例子

假设有一个银行项目,这个项目有五个 target。

  • Calculations
  • Drawing
  • TerminalApp
  • GuiApp
  • Checksum

这五个 target 的依赖关系如下图所示。

银行项目依赖关系图

理清关系

我们就可以这样去编写 cmake 的列表文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cmake_minimum_required(VERSION 3.26)
project(BankApp CXX)

add_executable(terminal_app terminal_app.cpp)
add_executable(gui_app gui_app.cpp)

target_link_libraries(terminal_app calculations)
target_link_libraries(gui_app calculations drawing)

add_library(calculations calculations.cpp)
add_library(drawing drawing.cpp)

add_custom_target(checksum ALL
COMMAND sh -c "cksum terminal_app>terminal.ck"
COMMAND sh -c "cksum gui_app>gui.ck"
BYPRODUCTS terminal.ck gui.ck
COMMENT "Checking the sums..."
)

add_dependencies(checksum terminal_app gui_app)

这里我们看到了列表文件中先 target_link_libraries()
add_library(). 这实际上是没有问题的。它们之间的依赖关系是不会乱的。

但是为了保证 checksum 的依赖关系,在末尾添加了一行add_dependencies(checksum terminal_app gui_app),这一行显式的宣布了 checksum 的依赖关系。