【问题标题】:Can I avoid exporting LD_LIBRARY_PATH by hardcoding library paths in the executable?我可以通过硬编码可执行文件中的库路径来避免导出 LD_LIBRARY_PATH 吗?
【发布时间】:2014-01-11 00:54:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux elf


    【解决方案1】:

    您想设置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.so 等...(然后运行ldconfig ...)。我不认为将用户特定目录添加到 /etc/ld.so.conf 是合理的......

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

    【讨论】:

    • 它是预建的;喜欢,发布编译和链接器。我不能在这里使用gcc。 :(
    猜你喜欢
    • 2014-11-25
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 2016-12-25
    • 2016-03-16
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多