首页 > 解决方案 > cmake target_link_libraries(),我们应该什么时候使用?

问题描述

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

要包含一个库,假设是 boost。我们可以简单地做 include_directories(BOOST_LIBRARY_PATH)。这使我的项目能够正确编译并且没有错误报告。

但是在网上看了一些帖子后,我注意到人们通常在包含目录之后添加 target_link_libraries(executable boost_library),所以我只是想知道为什么需要这一行。

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

(1) target_link_libraries 的实际作用是什么?(2) 如果我们不添加这一行,会不会影响性能?(3) 包含target_link_libraries有什么好处?

标签: cmaketarget-link-libraries

解决方案


target_link_libraries根据传递的参数做不同的事情。您是否应该使用它取决于您要达到的目标。(我建议使用target_include_directories而不是include_directories,因为它将包含目录的使用限制为单个目标,并且还允许您使包含目录可用于链接 cmake 库目标,如果标头用于库目标的公共标头中.)

  • 您可以传递库目标的名称。传递INTERFACE库目标是一个选项,可以与仅标头库一起使用。此外,对于已安装的外部库,提供 cmake 查找/配置脚本(通常)允许您访问库目标,如果设置正确,IMPORTED这些库目标会自动使目标的包含目录和依赖项可用于目标链接。target_link_libraries我强烈建议将此选项与 boost 一起使用。
  • 您可以将完整路径传递给库文件。我建议改为创建一个导入的库目标;这可能需要更多的工作,但它还允许您将信息附加到目标,例如包含目录,它将相关信息放在同一位置并允许更轻松地重用。
  • 您可以传递链接器能够找到的库的名称,例如target_link_libraries(executable pthread)在 Linux 上。
  • ...(我认为这里不相关的其他一些选项。)

在您的情况下,我的建议是:

  • 确保你已经安装了 boost
  • 使用find_package+target_link_libraries来“链接”标头库,在这种情况下,这只是使标头可用于您的目标的一种干净方式。(我假设您使用 boost 作为仅标头库,而不是库的静态或共享版本。)
find_package(Boost REQUIRED COMPONENTS headers CONFIG PATHS "/your/boost/install/path")
target_link_libraries(executable PRIVATE Boost::headers)

include_directories请注意,与使用指定输入目录相比,该程序不会更快或更慢;cmake 配置的速度可能会有所变化,但我不建议在那里偷工减料。


推荐阅读