【问题标题】:cmake target_link_libraries(), when should we use?cmake target_link_libraries(),我们应该什么时候使用?
【发布时间】:2021-08-21 05:22:26
【问题描述】:

我是 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有什么好处?

【问题讨论】:

  • target_link_libraries 负责将库添加到链接器的命令行中。如果您使用某些库但未为链接器指定它,则在创建可执行文件或共享库时会收到“未定义的引用”(或“未解析的外部”)错误:@987654321 @
  • @Tsyvarev 但是对于仅听者的库(如 boost),我们还需要添加 target_link_libraries 吗?这条线似乎是完全多余的,至少到目前为止我没有看到任何错误。
  • 哦,所以您使用的是不需要实现的标头。 (注意,整个 Boost 并不是一个只有头文件的库:它的许多头文件在相应的库文件中都有实现)。对于不需要实现target_link_libraries 的使用标头,不需要。但是Boost provides 实用程序目标Boost::Boost(或Boost::headers)。使用该目标调用 target_link_libraries 只会添加包含目录,而不添加库。
  • @Tsyvarev 感谢您的明确解释。如果我理解正确,如果我们使用监听器库或仅包含监听器文件的库的某些部分,include_directries 应该可以正常工作。但是让 target_link_libraries 将库链接到可执行文件总是好的,所以我们不会收到任何奇怪的错误。但实际上它们并没有太大的区别。

标签: cmake target-link-libraries


【解决方案1】:

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配置的速度可能会有所变化,但我不建议在那里偷工减料。

【讨论】:

    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 2011-07-04
    • 2017-09-13
    • 2021-12-29
    • 2011-07-17
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多