【问题标题】:Setting LD_LIBRARY_PATH environment variable for loading a shared library at runtime (g++)设置 LD_LIBRARY_PATH 环境变量以在运行时加载共享库 (g++)
【发布时间】:2013-03-31 11:57:22
【问题描述】:

我遇到了与同一问题相关的两个问题:

  1. 我有一个共享对象保存在 `pwd`/lib 中,虽然使用它的可执行文件编译成功(通过使用 -l 和 -L 开关),但在运行时,它让我很伤心。如果我尝试运行 LD_LIBRARY_PATH=/my/absolute/path/to/library/directory ./test 它工作正常。但是,如果我导出 LD_LIBRARY_PATH=/my/absolute/path/to/library/directory 并执行 ./test 它说它找不到共享库。但是,如果我再次使用LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./test,它就可以正常工作了!!关于我做错了什么有什么想法吗?

  2. 第二个问题与 LD_LIBRARY_PATH 环境变量的导出有关。如果我打开终端并输入export LD_LIBRARY_PATH=/path/to/stuff,然后输入echo $LD_LIBRARY_PATH,则变量是正确的。但是,如果我编写一个包含导出命令的脚本,只需运行它并不会更新变量,而是需要运行 source install.sh 才能真正持久化变量。最好的解决方案是什么?

感谢您的宝贵时间!

【问题讨论】:

    标签: g++ environment-variables dynamic-linking dynamic-library


    【解决方案1】:

    首先回答第二个问题:

    source 在当前 shell 中执行脚本,./install.sh 打开并在不同的 shell 中执行它。 http://www.unix.com/unix-dummies-questions-answers/537-difference-between-source-exec-script.html

    现在回答你的第一个问题:

    LD_LIBRARY_PATH=$LD_LIBRARY_PATH ./test 仅在一个命令(./test 命令)之前设置 LD_LIBRARY_PATH 变量。出于与上述相同的原因,我相信这不会转移到 ./test 创建的任何 shell。要使其持续存在,您可能需要将export LD_LIBRARY_PATH=... 放入您的~/.bashrc

    【讨论】:

    • 感谢您的回答!我试图找到一种方法来设置共享对象的路径,而不使用 sudo 命令(并将其放在 /usr/local/lib 中)或更改用户的 bash 文件。有普遍接受的方法吗?
    • 嗯,我认为没有“安全”的方法可以做到这一点,但请看这里:(linuxquestions.org/questions/linux-software-2/…)。我对此知之甚少,但我已经看到建议将您的主程序包装在一个简单的脚本中,该脚本设置库路径,运行您的实际程序,然后取消设置它。用户应该运行脚本,而不是直接调用您的程序。
    • 实际上,这可能会有所帮助:osr507doc.sco.com/en/tools/ccs_linkedit_dynamic_dirsearch.html 它与 LD_RUN_PATH 变量有关,它允许您在链接时指定库位置(LD_LIBRARY_PATH 的替代方案,它“让您做同样的事情在运行时”)。这是关于我对此知识的限制,对不起......
    • 谢谢,那我就用脚本吧。 LD_RUN_PATH 用于编译时 afaik,并且已经使用 -L 处理了。
    【解决方案2】:

    我发现有时通过 CFLAGS 环境变量显式添加 -L 是成功的,而 LD_RUN_PATH 不是。如: 导出 CFLAGS=-L/opt/tool/lib

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-28
      • 2023-04-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      相关资源
      最近更新 更多