搞懂include_directories、target_include_directories、link_libraries、target_link_libraryes的区别

正文

*include_directories 用于向编译器提供包含目录列表。 当使用预处理器包含文件时,将在这些目录中搜索该文件。

*link_libraries 用于向链接器提供库(对象档案)列表。 如果链接项是 cmake 目标,并且指定了包含目录,则不需要使用 *include_directories 单独指定它们。

target_* 版本仅适用于作为操作数给出的目标。 非目标版本适用于目录中的所有目标。 应尽可能使用 target_* 版本(即几乎总是)。

find_package 用于从外部源(即项目外部)搜索 cmake 设置。 如果您想链接一个库而不将库的源代码包含在项目的子目录中,那么您可以使用 find_package。 从较低级别的角度来看,find_package(Foo) 查找cmake 模块FindFoo.cmake 并执行该模块。 该模块的目的是生成可用于包含相应依赖项的 cmake 变量或目标。

add_library 与 add_executable 类似,不同之处在于它添加库的目标,而不是可执行文件。 库目标可以用作 link_libraries 中的项目,并且它们的依赖项默认是可传递的。

所有这些都与库有关。 除了 *include_directories 还用于指定项目自己的头文件的包含目录,而不仅仅是库的包含目录。


例如,包含的库需要 Boost,但核心项目不需要。 如何避免整个 CMakeLists.txt 文件和二进制文件膨胀,并仍然使用预编译库?

如果 find_package 模块已经为库创建了一个 cmake 目标(使用 add_library(… IMPORTED)),它本身指定了依赖项的依赖项,那么只需使用 link_libraries 与其链接,cmake 就会负责与依赖项的链接。 目标的包含目录也是如此。

旧的 cmake 模块不一定提供目标,在这种情况下,您可能需要编写自己的模块以避免项目配置膨胀。

注意:

  1. link_libraries(要添加全路径)用在add_executable之前,target_link_libraries用在add_executable之后
  2. link_libraries 基本上被遗弃了,尽可能用 target_link_libraries
  3. target_link_libraries 连接的时候不指定具体某个库的时候可以指定一个目录,如果目录下就固定的一种库是没有问题,如果有其他库就会出现连接问题,最好是指定具体的库名称,例如: - lxxx.so
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值