gpt4 book ai didi

c++ - 使用CMake时如何避免 'cannot open shared object file'?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:44:40 34 4
gpt4 key购买 nike

情况

  • 我的项目使用 CMake,在 Ubuntu 16.04 上编译没有问题。

  • 启动已编译的应用程序时,我收到消息 cannot打开共享对象文件

  • 所有共享对象库都在同一个非标准中可用文件夹(我在那里需要它们)。

  • 出于某种原因,有些可以找到,但有些不能。

我需要什么

  1. 共享对象有的能找到,有的找不到的原因。该项目非常大,包含许多 CMake 文件。我试图找到可以加载的库和不能加载的库之间的区别,但没有成功。欢迎任何帮助我找到正确的地方。
  2. 在 CMake 中找到所有共享对象的解决方案。

ldd

ldd 输出显示可以找到大多数共享对象。以下是一些示例:

libboost_filesystem.so.1.55.0 => /path/to/libs/boost/lib/libboost_filesystem.so.1.55.0 (0x00007f2ed1fa0000)
libboost_filesystem.so.1.55.0 => /path/to/libs/boost/lib/libboost_filesystem.so.1.55.0 (0x00007f96af1f5000)
libboost_program_options.so.1.55.0 => /path/to/libs/boost/lib/libboost_program_options.so.1.55.0 (0x00007f96aef85000)
libboost_system.so.1.55.0 => /path/to/libs/boost/lib/libboost_system.so.1.55.0 (0x00007f96aed80000)

由于某些原因无法找到其他一些。例如:

libboost_iostreams.so.1.55.0 => not found
libboost_chrono.so.1.55.0 => not found

还有其他非提升库显示相同的行为,但为简单起见,我只展示提升示例。

已经尝试过的解决方法

以下是已经成功运作的变通办法。但我对我需要的部分中的两点非常感兴趣。

最佳答案

tldr; 检查导入的库是否作为 SHARED 或 UNKNOWN 而不是 STATIC 导入,并且具有 IMPORTED_SONAME 属性。

您应该检查正在链接的库是如何导入的。

我已经分析了一些静态库和动态库的配置模式导出目标,它们为目标设置的属性略有不同。

例如对于 zlib,这里是静态库的版本:

add_library(ZLIB::zlibstatic STATIC IMPORTED)
set_target_properties(ZLIB::zlibstatic PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_NOCONFIG "C"
IMPORTED_LOCATION_NOCONFIG "${_IMPORT_PREFIX}/lib/libz.a"
)

但是,对于动态库,它是:

add_library(ZLIB::zlib SHARED IMPORTED)
set_target_properties(ZLIB::zlib PROPERTIES
IMPORTED_LOCATION_NOCONFIG "${_IMPORT_PREFIX}/lib/libz.so.1.2.11"
IMPORTED_SONAME_NOCONFIG "libz.so.1"
)

在 find_package 模块模式脚本中,您可能认为您正在导入静态库,而实际上找到的库是 .so,因此它可能使用了不正确的目标属性。在配置模式下,这不太可能,因为它在定义目标时更加明确。虽然,模块模式 (cmake/findXXX.cmake),您通常将这些属性定义为 FIND_PACKAGE_HANDLE_STANDARD_ARGS _LIBRARIES 变量的结果,并且很难说出您将获得什么。您可以在搜索中使用 libFoo.a 以更加明确或使用 CMAKE_FIND_LIBRARY_SUFFIXES。

关于c++ - 使用CMake时如何避免 'cannot open shared object file'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41385426/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com