我可以通过硬编码可执行文件中的库路径来避免导出LD_LIBRARY_PATH吗?

时间:2013-12-22 18:46:43

标签: linux elf

我正在使用预构建的(无源/目标文件)二进制应用程序进行分发。二进制应用程序需要一些默认情况下未包含的库。我似乎能够让最终用户启动应用程序的唯一方法是包含一个run.sh,它将库路径设置为当前目录:

export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH
./MyApp.out

但是,我真的想让用户只需解压缩zip并双击MyApp.out(没有shell脚本)。我可以编辑MyApp.out来搜索库的当前目录吗?我在OSX上使用install_name_tool做了类似的事情,但是这个工具在这里不可用。

1 个答案:

答案 0 :(得分:4)

您想要设置rpath。见this answer。所以链接使用

   gcc yourobjects*.o -L/some/lib/dir/ -lsome -Wl,-rpath,.

但您甚至可能希望使用-Wl,-rpath,$PWD-Wl,-rpath,'$ORIGIN'。请参阅this

您也可以(这应该适用于预先构建的可执行文件)通过在其中添加一条绝对路径(包含lib的目录)来配置您的/etc/ld.so.conf,然后运行ldconfig -v ......见ldconfig(8)

我建议将/usr/local/lib添加到/etc/ld.so.conf并制作符号链接/usr/local/lib/libfoo.so到例如$HOME/libfoo.soldconfig等等......(然后运行/etc/ld.so.conf ...)。我不认为将用户特定目录添加到*.deb是合理的......

PS。您真正想要的是package您的应用程序(例如,作为Debian或Ubuntu的*.rpm包,或者Fedora或Redhat的{{1}}。包管理系统处理依赖关系!