cmake 将外部库与 IMPORT_SONAME ro IMPORT_LOCATION 链接

Posted

技术标签:

【中文标题】cmake 将外部库与 IMPORT_SONAME ro IMPORT_LOCATION 链接【英文标题】:cmake to link external library with IMPORT_SONAME ro IMPORT_LOCATION 【发布时间】:2021-06-28 14:12:31 【问题描述】:

我有一个链接到外部库的 C++ 项目 该库由供应商提供,其中仅包含一个 .h 标头目录和一个共享对象文件“libabc.so”。

在我的项目的 CMakeLists 中,我有一个使用外部库的 obj(我将它构建到 bar.so)。

在构建最终的可执行文件时,我尝试了多种方法。

add_library(bar STATIC /some/source/file/bar.cpp)

add_library(abc_lib SHARED IMPORTED)
set_property(TARGET abc_lib PROPERTY IMPORTED_LOCATION /path/to/external/lib/libabc.so)

add_executable(foo /some/file/to/main.cpp)
target_link_libraries(foo bar abc_lib)

这构建正常并且链接正常,但是当我这样做时 ldd foo,abc_lib没有以

的形式出现

abc.so => /path/to/external/lib/libabc.so 相反,它以独立的形式显示 /path/to/external/lib/libabc.so,根据我最近阅读的一些帖子,这表明该库没有直接链接。

但是当我执行chrpath -d foopatchelf --remove-rpath foo时,可执行文件仍然包含路径并且不会使用我在 LD_LIBRARY_PATH 中提供的路径

所以我尝试了另一种方式

add_library(bar STATIC /some/source/file/bar.cpp)

add_library(abc_lib SHARED IMPORTED)
set_property(TARGE abd_lib PROPERTY IMPORTED_SONAME abc)
link_libraries(/path/to/external/lib)

add_executable(foo /some/file/to/main.cpp)
target_link_libraries(foo bar abc_lib)

然而这一次,它抱怨 abc_lib-NOTFOUND

总结我的问题,我想要一个针对本地共享对象的项目构建链接,同时我应该能够使用chrpathpatchelf 清理rpath,以便我可以复制可执行文件到具有类似环境但可能与外部库路径不同的服务器,我想使用 LD_LIBRARY_PATH 覆盖路径。

【问题讨论】:

可以先尝试查找库find_library,设置PATHS 选项,我们会找到本地库。 【参考方案1】:

您要查找的密钥是IMPORTED_NO_SONAME。 您可以向共享导入库目标添加额外的属性:

set_property(TARGET abc_lib PROPERTY IMPORTED_NO_SONAME TRUE)

一个 cmake 命令或更好:

set_target_properties(abc_lib PROPERTIES
  IMPORTED_LOCATION /path/to/external/lib/libabc.so
  IMPORTED_NO_SONAME TRUE
)

CMake 将使用 /path/to/external/lib/libabc.so 而不是 -L/path/to/external/lib -llibabc.so 作为链接如果 libabc.so 在其 ELF 标头中没有 soname 的选项。 您可以通过以下方式验证这一点:

readelf -d /path/to/external/lib/libabc.so

官方cmake文档:Imported Libraries解释更多细节。

【讨论】:

以上是关于cmake 将外部库与 IMPORT_SONAME ro IMPORT_LOCATION 链接的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将库与 cmake 链接?

(转)HelloWorld CMake CMake中构建静态库与动态库及其使用

在 Windows 10 上使用 Armadillo 作为库与 CLion 和 CMake 的问题

CMake--静态库与动态库构建

如何使用cmake生成基于静态库的动态链接库

CMAKE编译时如何自动下载第三方库并解压安装到指定目录