cmake target_link_libraries(),何时使用?

cmake target_link_libraries(),何时使用?,cmake,target-link-libraries,Cmake,Target Link Libraries,我是CMake的新手,只想了解一些有关target_link_库如何工作的细节 要包含一个库,我们可以说boost。我们可以简单地包含目录(BOOST\u LIBRARY\u PATH)。这允许我的项目正确编译,并且没有错误报告 但是在网上阅读了一些帖子之后,我注意到人们通常在include目录之后添加target_link_库(可执行的boost_库),所以我想知道为什么需要这一行 由于我的项目在性能方面非常敏感(即,我希望它尽可能快地运行),我的问题如下: (1) 目标链接库实际上做什么?

我是CMake的新手,只想了解一些有关target_link_库如何工作的细节

要包含一个库,我们可以说boost。我们可以简单地包含目录(BOOST\u LIBRARY\u PATH)。这允许我的项目正确编译,并且没有错误报告

但是在网上阅读了一些帖子之后,我注意到人们通常在include目录之后添加target_link_库(可执行的boost_库),所以我想知道为什么需要这一行

由于我的项目在性能方面非常敏感(即,我希望它尽可能快地运行),我的问题如下:

(1) 目标链接库实际上做什么? (2) 如果我们不添加这一行,会影响性能吗?
(3) 包含目标链接库的优点是什么?

目标链接库根据传递的参数执行不同的操作。你是否应该使用它取决于你到底想要实现什么。(我建议使用
target\u include\u directories
而不是
include\u directories
,因为它将include dir的使用限制在单个目标上,并且还允许您将include dir用于链接cmake库目标(如果在库目标的公共头中使用头的话)


  • 您可以传递库目标的名称。传递
    接口
    库目标是一个选项,可用于仅标题库。此外,对于已安装的外部库,如果设置正确,提供cmake查找/配置脚本(通常)允许您访问
    导入的
    库目标,该库目标可通过
    target\u link\u库
    自动使目标的包含目录和依赖项可供目标链接使用。我强烈建议将此选项与boost一起使用
  • 您可以传递库文件的完整路径。但是我建议创建一个导入的库目标;这可能需要更多的工作,但它也允许您将信息附加到目标,例如包含目录,将相关信息放在同一位置,并允许更容易地重用
  • 您可以传递链接器能够找到的库的名称,例如Linux上的
    target\u link\u库(可执行pthread)
  • 。。。(一些其他的选择我在这里并不真正考虑。)
我对你的建议是:

  • 确保已安装boost

  • 使用
    find_-package
    +
    target_-link_-libraries
    来“链接”标题库,在这种情况下,这只是一种使标题对目标可用的干净方法。(我假设您将boost用作仅标题库,而不是静态或共享版本的库。)

请注意,与使用
include_directories
指定输入目录相比,该程序不会更快或更慢;cmake配置的速度可能会稍有变化,但我不建议在这方面走捷径。

target\u link\u libraries
负责将库添加到链接器的命令行中。如果您使用某个库,但没有为链接器指定它,则在创建可执行文件或共享库时会出现“未定义引用”(或“未解析外部”)错误:@Tsyvarev但对于仅听者库(如boost),我们是否仍需要添加目标链接库?这行代码似乎被完全删除了,至少到目前为止我没有看到任何错误。哦,你使用的是不需要实现的标题。(请注意,Boost整体上并不是一个只包含头的库:它的许多头在相应的库文件中都有实现)。对于不需要实现的使用头,不需要
目标链接库
。但是实用程序目标是Boost::Boost
(或者
Boost::headers
)。使用该目标调用
target\u link\u libraries
将只添加包含目录,而不添加库。@Tsyvarev感谢您的清晰解释。如果我理解正确,如果我们使用的是Header库或库中仅包含Header文件的某些部分,include_目录应该可以正常工作。但是让target\u link\u库将库链接到可执行文件总是好的,这样我们就不会出现任何奇怪的错误。但事实上,它们并没有多大区别。
find_package(Boost REQUIRED COMPONENTS headers CONFIG PATHS "/your/boost/install/path")
target_link_libraries(executable PRIVATE Boost::headers)