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

标签 linux elf

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

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

但是,我真的很想允许用户解压缩 zip 并双击 MyApp.out (没有 shell 脚本)。我可以编辑 MyApp.out 来搜索当前目录中的库吗?我已经使用 install_name_tool 在 OSX 上完成了类似的操作,但该工具在此处不可用。

最佳答案

您想要设置 rpath 。请参阅this answer 。所以链接使用

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

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

您还可以(这应该适用于预构建的可执行文件)通过在其中添加一行带有绝对路径(包含lib),然后运行 ​​ldconfig -v ......请参阅 ldconfig(8)

我建议将/usr/local/lib添加到/etc/ld.so.conf中,并从/usr/local/lib创建符号链接(symbolic link)/libfoo.so 例如$HOME/libfoo.so 等...(然后运行ldconfig ...)。我认为将用户特定目录添加到 /etc/ld.so.conf 是不合理的...

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

关于linux - 我可以通过在可执行文件中硬编码库路径来避免导出 LD_LIBRARY_PATH 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20732797/

相关文章:

linux - perl 没有正确评估 bash 脚本

c++ - 使用 clang++、-fvisibility=hidden、typeinfo 和 type-erasure

linux - LD_PRELOAD如何更新库函数

linux - 共享库符号冲突和静态链接(在 Linux 上)

node.js - Bitbucket 管道运行 npm 失败

C++ Linux TickCount

linux - 了解上周有多少用户连接到我的计算机,以及每个用户连接了多少次

linux - .comment 部分有两行

java - Linux native 可执行文件不包含正确的符号信息

linux - 显示未安装的RPM包的信息?