gpt4 book ai didi

c++ - 为什么在linux(cmake)中加载共享库时安装的程序出错

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:12 25 4
gpt4 key购买 nike

我有一个问题是关于如何在依赖于某些外部库时使用 cmake 安装构建的可执行程序。假设我的可执行文件是 abc,它依赖于两个外部库:lib1.solib2.so。代码结构如下:

-.........
|----bin (lib1.so lib2.so)
|----include(lib1.h lib2.h)
|----src(main.cpp)

当使用以下 cmake 命令安装可执行程序时:

INSTALL(TARGETS ${Exe_Name}
RUNTIME DESTINATION Path to bin
LIBRARY DESTINATION Path to bin)

我希望可执行程序与 lib1.solib2.so 位于同一目录中。但是,当我在安装文件夹中执行构建的程序时,遇到了以下错误:

error while loading shared libraries: lib1 can not open shared object file No such file or directory

如果我使用 ldd 检查可执行文件,我发现 lib1.solib2.so not found。在搜索了可能的解决方案之后,我发现如果我以这种方式调用可执行文件,那么它就可以工作了:

LD_LIBRARY_PATH=./ ./my_program_run

那么我的问题是如何让我的可执行程序在安装时通过 cmake 知道共享库的位置?谢谢。

最佳答案

最好使用最终可执行文件的 RPATH 来解决这个问题。 RPATH 是可执行文件本身的硬编​​码搜索路径,并允许使用字符串 $ORIGIN,它在运行时扩展到可执行文件的位置。请参阅此引用资料:http://man7.org/linux/man-pages/man8/ld.so.8.html

CMake 在安装时剥离二进制文件的 rpath,以避免二进制文件拾取散落在开发树周围的库。但正是出于这个原因,它还提供了一种修改安装 rpath 的简单方法。这是简短的回答:

IF(UNIX)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_RPATH}:\$ORIGIN/../bin:\$ORIGIN")
ENDIF()

此特定示例附加到现有的 rpath,并将 .../bin 添加到搜索路径,所有这些都与二进制文件的位置相关。

一些开发人员声称调整二进制文件的 RPATH 不是一个好主意。在理想世界中,所有库都将位于系统库目录中。但是如果你把它发挥到极致,你最终会得到 Windows(至少是旧的),其中 c:\windows\system32 充满了谁知道来自哪里的垃圾,并且可能会或可能不会与其他软件冲突,等。使用 rpath 并将所有内容安装在一个地方似乎是一个很好的解决方案。

关于c++ - 为什么在linux(cmake)中加载共享库时安装的程序出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22206122/

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