Modern Cmake常用指令

4 分钟阅读

构建目标(可执行程序/代码库/纯头文件库)

添加库

1
add_library(<target> [STATIC | SHARED] [source1] [source2...])

添加接口库

1
add_library(<target> INTERFACE)

一般用作纯头文件库或虚拟库(用来表示多个库集合), 把target_xxx_xxx( xxx)指令相关的配置给暴露到外部, 下面有关于INTERFACE, PUBLIC, PRIVATE的解释

添加可执行文件

1
add_executable(<target> [source1] [source2...])

添加依赖库和头文件路径到目标

添加头文件搜索路径

1
2
3
target_include_directories(<target>
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

添加依赖的子库

1
2
3
target_link_libraries(<target>
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

Modern Cmake推荐不要使用link_libraries, include_directories等不带target_前缀的命令扰乱项目依赖关系.

INTERFACE, PUBLIC, PRIVATE三个关键字就跟c++,java等面向对象语言中的概念类似, 举个例子:

在构建target时会链接到public_item目标和private_item目标且会继承它们的PUBICINTERFACE依赖, 但不会链接到interface_item目标

1
2
3
4
target_link_libraries(target
  INTERFACE interface_item
  PUBLIC public_item
  PRIVATE private_item)

在构建new_target时会链接到target目标本身和public_item目标, interface_item目标且会继承它们的PUBICINTERFACE依赖, 但不会链接private_item目标.

1
2
target_link_libraries(new_target
  PRIVATE target)

多目录构建

把子目录加入到构建过程中:

1
add_subdirectory(directory)

此命令会把子目录中的目标暴露到调用位置,方便继续添加依赖,常规用法例子:

1
2
add_subdirectory(dir_name)
target_link_libraries(${PROJECT_NAME} INTERFACE target1 target2) # target1和target2是dir_name目录中CMakelist.txt中的目标名

辅助调试

cmake隐藏了完整编译过程, 为了确定cmake配置是否正确, 偶尔看看完整的编译输出还是必要的.

使用ninja时:

1
2
cmake -G Ninja ..
ninja -v

使用cmake时:

1
2
cmake -G "Unix Makefiles" ..
make VERBOSE=1

留下评论