【发布时间】: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