注:
- 文章参考: 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_compile_definitions()、target_compile_options()、target_include_directories()和target_link_libraries(),并展示了如何通过INTERFACE指定库的使用需求。通过实例展示了在VSCode+CMake+MSYS2环境下如何重构代码,强调了在大型项目中使用这些命令以优化依赖管理和构建过程的重要性。

127

被折叠的 条评论
为什么被折叠?



