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

本文介绍了CMake中使用需求的概念,如target_compile_definitions()、target_compile_options()、target_include_directories()和target_link_libraries(),并展示了如何通过INTERFACE指定库的使用需求。通过实例展示了在VSCode+CMake+MSYS2环境下如何重构代码,强调了在大型项目中使用这些命令以优化依赖管理和构建过程的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注:

使用需求(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按钮, 重新构建.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

falwat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值