CMake 教程(Step 3): 为库添加使用需求
作者:互联网
注:
- 文章参考: CMake Tutorial, 但操作方法和步骤与原文不同.
- 文章所有操作均在
VSCode
中完成.点击Windows 上VS Code + CMake + MSYS2 打造C++开发环境, 获取配置VSCode
开发环境的详细步骤.- 点击CMake 教程, 查看CMake教程主页.
- 点击CMake 教程(Step 2): 添加库, 查看上一节.
使用需求(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,target,directories,MathFunctions,Step,INTERFACE,include,为库 来源: https://blog.csdn.net/falwat/article/details/122275973