CMake 教程(Step 3): 为库添加使用需求

注:

使用需求(Usage Requirements)允许更好地控制库或可执行文件的链接关系和包含关系,同时也可以在CMake中对目标的传递属性进行更多的控制。涉及使用需求的主要命令有:

  • target_compile_definitions() 目标的编译宏定义
  • target_compile_options() 目标的编译选项
  • target_include_directories() 目标的包含路径
  • target_link_libraries() 目标要链接的库

让我们用新式CMake方法来重构从上一节的代码. 首先, 任何链接到MathFunctions的目标都需要包含当前源目录,而MathFunctions库本身则不需要。这种叫接口形式(INTERFACE)的使用需求.INTERFACE意味着构建时,需求方(consumers)需要而生产方(producer)不需要的东西。对MathFunctions/CMakeLists.txt修改如下:

add_library(MathFunctions mysqrt.cxx)
target_include_directories(MathFunctions INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

现在,我们已经指定了MathFunctions的使用需求,我们可以安全地从顶层CMakeLists.txt中删除EXTRA_INCLUDES变量,如下:

...
target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}")
...
if(USE_MYMATH)
  add_subdirectory(MathFunctions)
  list(APPEND EXTRA_LIBS MathFunctions)
endif()
...

我的一点看法:

  • 关于target_include_directories(INTERFACE)确实有点绕, 这种设计真的是有点不可理解. 记住就好了.
  • 对于于"Step2", 可能看不出太大区别, 但如果换一个大型项目的话, 我们不再需要在顶层的CMakeLists.txt中挨个添加包含.

点击状态栏的Build按钮, 重新构建.

上一篇:cmake(9) 配置thread线程


下一篇:CMake指令入门