【发布时间】:2026-01-03 18:55:01
【问题描述】:
我有一个链接到外部库的 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 foo 或patchelf --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
总结我的问题,我想要一个针对本地共享对象的项目构建链接,同时我应该能够使用chrpath 或patchelf 清理rpath,以便我可以复制可执行文件到具有类似环境但可能与外部库路径不同的服务器,我想使用 LD_LIBRARY_PATH 覆盖路径。
【问题讨论】:
-
可以先尝试查找库
find_library,设置PATHS选项,我们会找到本地库。