首先,我希望我在这里在正确的上下文中提出这个问题......
我用 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 特有的问题?或者我可以在执行可执行文件之前指定进程的工作目录吗?
我想避免在启动应用程序之前更改系统配置/环境...