【问题标题】:CMake: Proper way to install boost component libraries with projectCMake:使用项目安装 boost 组件库的正确方法
【发布时间】:2020-10-08 10:38:30
【问题描述】:

我正在针对 Boost 共享库构建和链接一个项目。现在:如何将这些库放入目标应用程序的安装目录?我需要这个,因为应用程序将安装在没有正确 Boost 版本的容器中。

我在多种变体中尝试的是:

install(PROGRAMS ${Boost_LIBRARIES} DESTINATION install/lib)

但无论是这个还是我能想到的任何其他变体都没有给我实际的共享库文件名。

【问题讨论】:

  • 在 Windows 中,如果问题所在,库名称是 .lib 而不是 .dll。
  • @drescherjm 不,这不是问题。问题是如何正确安装用于构建项目的 boost 运行时库。
  • 我的意思是如果您需要 dll 名称,您可以使用 ${Boost_LIBRARIES} 获取 .dll 名称,因为您在 Windows 上。您还可以使用 BundleUtilities 收集可执行目标的 .dll 依赖项。我有时会使用这两种技术。
  • @drescherjm ${Boost_LIBRARIES} 解析为导入的目标,例如 Boost::asio。这对安装没有帮助。我正在寻找的是一种获取实际文件的方法......
  • 您可以遍历 ${Boost_LIBRARIES} 中的项目删除扩展名并添加 .dll 扩展名以获取 .dll 名称(当这些是导入库时)。您还可以检测这些是否是目标,并从循环中获取每个 dll 的完整路径。我在我的脚本中这样做。

标签: c++ installation boost cmake


【解决方案1】:

这是对这个问题的答案的简短摘要。 如需完整成绩单,请参阅the revision history

接受的答案

问题中指示的代码行应该可以工作,但这取决于 CMake 如何定位 Boost 框架。

只有 Boost 框架的特定组件具有可安装的运行时库。如果您需要其中任何一个,您必须在 CMakeLists.txt 文件的 FindBoost 命令中列出这些组件。

我已经在 Ubuntu 18.04 上使用 CMake 3.10 和 Boost 1.65 使用以下最小的 CMakeLists.txt 对此进行了测试:

cmake_minimum_required(VERSION 3.10)
find_package( 
 Boost 1.65 REQUIRED 
 COMPONENTS  filesystem system 
)
install(PROGRAMS ${Boost_LIBRARIES} DESTINATION ~/install/lib)

遵循...的标准约定:

mkdir build
cd build
ccmake ..
cmake .
make
make install

...我成功看到 libboost_filesystem.so 和 libboost_system.so 安装在用户主文件夹下的指定位置。

【讨论】:

  • 下载 BoostBuilder 后,我建议将 CMakeLists 的第 34 行编辑为较新的版本(例如 71),并将第 163 和 164 行更新为匹配的 URL 和 HASH。另外,尝试将第 178 行的关键字 install 替换为 stage。
  • 对于版本 71,第 163/164 行的匹配值为 URL "dl.bintray.com/boostorg/release/1.71.0/source/…" 和 URL_HASH SHA256=d73a8da01e8bf8c7eda40b4c84915071a8c8a0df4a6734537ddde4a8580524ee
  • 我在 Linux 上并且知道我需要包含哪些库。现在我正在使用构建环境的共享库的硬编码路径来完成它。但这似乎根本不是一个好的解决方案。
  • @jpo234 我提供了一个适合我的 CMakeLists.txt。
【解决方案2】:

我在这里找到了答案:https://cmake.org/pipermail/cmake/2010-March/036053.html

我认为你应该能够使用 get_target_properties(LOCATION) 导入的目标,然后 install(FILES ... ) 与位置 你明白了。

...所以这可能适用于您的情况:

foreach(lib_target ${Boost_LIBRARIES})
    get_target_property(lib_location ${lib_target} LOCATION)
    install(FILES ${lib_location} DESTINATION lib)  
endforeach()

【讨论】:

  • 我无法编辑你的答案,但} 很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
相关资源
最近更新 更多