cmake - 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有什么好处?
解决方案
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 配置的速度可能会有所变化,但我不建议在那里偷工减料。
推荐阅读
- python - Python 数据类型发现
- docker - 为什么我无法从我的主机连接到 dockerized 服务?
- java - 如何“缩小”画布
- object - MQL4 绘制带有文本的动态 Rectangle_Label
- r - 为什么 data.table 会忘记 R 中的列表名称?
- ruby-on-rails - 尝试获取 div 时出现未捕获的类型错误无法读取未定义的属性长度
- ios - 有没有办法从我的任务在委托上创建的上下文中检索任何数据?
- date - RollingFile Appender 不使用当前日期
- java - 为什么 Jetty 从 maven 创建的目标文件夹中获取 java 类引用?
- php - 在我的表单上注册时如何阻止某些电子邮件域(php)