cmake编译

在 CMake 中,add_dependenciestarget_link_libraries 是两个不同的命令,用于不同的目的。

add_dependencies

add_dependencies 用于在目标之间建立构建依赖关系。它指定一个目标在另一个目标之前构建。

语法:

1
add_dependencies(target-name dependency-target1 [dependency-target2 ...])
  • target-name: 需要依赖其他目标的目标。
  • dependency-target: target-name 依赖的目标。

使用场景:

  • 当你希望确保某个目标在另一个目标之前构建时使用。例如,当你有一个生成器目标,它生成某些文件,这些文件需要被另一个目标使用时。

示例:

1
2
3
4
5
6
add_executable(main main.cpp)
add_custom_target(generator ALL
COMMAND python generate_code.py
BYPRODUCTS generated_code.cpp)

add_dependencies(main generator)

在这个例子中,main 可执行文件依赖于 generator 目标,generator 目标会运行一个 Python 脚本来生成 generated_code.cpp 文件,然后 main 才会构建。

target_link_libraries 用于将目标链接到库或其他目标。它指定链接器在构建目标时应使用的库。

语法:

1
target_link_libraries(target-name [PRIVATE|PUBLIC|INTERFACE] library1 [library2 ...])
  • target-name: 需要链接库的目标。
  • [PRIVATE|PUBLIC|INTERFACE]: 指定库的可见性和使用范围:
    • PRIVATE: 库只对目标本身可见,不传播。
    • PUBLIC: 库对目标和所有使用该目标的依赖可见。
    • INTERFACE: 库仅对使用该目标的依赖可见,不直接链接到目标。
  • library: 要链接的库或目标。

使用场景:

  • 当你希望将一个目标链接到一个库或另一个目标时使用。例如,将可执行文件链接到一个共享库或静态库。

示例:

1
2
3
add_library(mylib STATIC mylib.cpp)
add_executable(main main.cpp)
target_link_libraries(main PRIVATE mylib)

在这个例子中,main 可执行文件链接到 mylib 库,这意味着在构建 main 时,链接器会将 mylib 库包含进来。

总结

  • add_dependencies 是在目标之间建立构建顺序依赖关系,确保一个目标在另一个目标之前构建。
  • target_link_libraries 是用于指定目标在链接时需要的库或目标。

这两个命令在 CMake 中有着不同的用途,但都在管理项目的构建流程中起着重要作用。