c++ - 在 Linux 中为 C++ 应用程序指定静态库的位置

标签 c++ linux static-libraries codeblocks

首先,我希望我在正确的上下文中提出这个问题...

我使用 Code::Blocks 在 C++ 中构建了一个应用程序。应用程序使用第三方提供的静态库,无法通过包管理安装到系统中。因此,我在分发我的应用程序时发布了这些库。

这是我的目标配置:

<Target title="Unix_162">
<Option output="bin/my_app" prefix_auto="1" extension_auto="1" />
<Option working_dir="/home/marco/third_party_dist/lib" />
<Option object_output="obj/Unix_162" />
<Option type="1" />
<Option compiler="gcc" />
<Option use_console_runner="0" />
<Option parameters="-c" />
<Compiler>
<Add directory="/home/marco/third_party_dist/include" />
</Compiler>
<Linker>
<Add library="/home/marco/third_party_dist/lib/lib1.so" />
<Add library="/home/marco/third_party_dist/lib/lib2.so" />
<!-- some more included the same way -->
<Add directory="/home/marco/third_party_dist/lib" />
</Linker>
</Target>

我可以很好地构建这个目标并运行它。一切正常。

今天,我尝试在 Debian Squeeze 上运行并复制了一个文件夹,其中包含来自第三方的可执行文件和库。我认为只要所有内容都在一个文件夹中,可执行文件就会找到 .so 文件。我错了。我收到消息:

/home/my_app/my_app: error while loading shared libraries: lib1.so: cannot open shared object file: No such file or directory

我的开发机器上没有收到此消息,因为 Code::Blocks 能够为可执行文件设置工作目录。我可以通过将 .so 文件的位置放在/etc/ld.so.conf.d/my_app.conf... 中来删除错误消息...

我是否可以构建可执行文件以便它在执行目录中搜索库?或者这是 Debian 特有的问题?或者我可以在执行可执行文件之前指定进程的工作目录吗?

我想避免在启动应用程序之前更改系统配置/环境...

最佳答案

首先,这些不是静态库(它们是共享的)。

所以问题是在运行时定位库。
有几种方法可以做到这一点:

1) 设置LD_LIBRARY_PATH 环境变量。
这类似于 PATH,但用于共享库。

2) 在可执行文件中设置rpath。
这是返回到可执行文件的路径,其中搜索共享库

-Wl,-rpath,<LIB_INSTALL_PATH>

这可以设置为 .,这将使它在当前目录中查找。
或者您可以设置为 '$ORIGIN',这将使它在安装应用程序的目录中查找。

3) 您可以将它们安装到共享库的默认位置之一。
查看 /etc/ld.so.conf 但通常是 /usr/lib/usr/local/lib

4) 您可以添加更多默认位置
修改/etc/ld.so.conf

关于c++ - 在 Linux 中为 C++ 应用程序指定静态库的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11780089/

相关文章:

c++ - 紧凑且简单的 std::tuple 反转

c++ - 如何为 OpenGL 的线条添加发光效果?

linux - 如何在linux中编辑/etc/pam.d/sytem-auth-ac文件?

android - 将函数从静态库导出到共享库

c - 简单的 C 音频库

c - 在静态库中包含静态库依赖项的语句

C++ 从 dll 调用 FORTRAN 子程序

c++ - 为什么 string::begin 存在?

c++ - 如何在 for 循环中使用 random_engine 和 mt19937

c - 如何终止正在等待信号量操作的线程