【问题标题】:Shared Library Path as Executable Directory共享库路径作为可执行目录
【发布时间】:2010-12-19 15:04:15
【问题描述】:

为了代码重用,我有一个应用程序被分成几个库。在 Windows 上,我所要做的就是将 .dll 文件放在与可执行文件相同的路径中,它会自动找到它们。在 Linux 上(因为它硬编码了事物的路径)我必须指定环境变量 LD_LIBRARY_PATH 或在可执行文件之前预加载库。

我已经看到一些关于使用-Wl,-rpath=<PATH> 的链接器选项嵌入路径的事情,并且我已经尝试使用. 作为路径。但这只是查看当前工作目录,而不是可执行文件的目录。

有没有办法在链接器中指定默认情况下在可执行文件的目录中查找共享库(如在 Windows 上)?

谢谢! 马特

【问题讨论】:

    标签: c++ linux gcc linker shared-libraries


    【解决方案1】:

    您需要在rpath中的$起源,通过适当的ld或其他达尔文工具。请参阅thisthis

    请记住,$ 必须真正以路径结尾,因此您需要在链接命令行中引用或转义它。

    更新: 您可以使用

    查看链接器实际放入可执行文件中的内容
    readelf -d /path/to/exe | grep RPATH
    

    下面是输出的样子:

     0x0000000f (RPATH)              Library rpath: [$ORIGIN]
    

    【讨论】:

    • 使用 $ORIGIN 时,您需要确保正确引用 $ 以便链接器实际看到它。从命令行,你想要“-rpath \$ORIGIN”,从 Makefile 你想要“-rpath \$$ORIGIN”
    • 我正在使用 Eclipse 和 CDT,并且我将选项放在杂项链接器标志下。我输入了-Wl,-rpath=$$ORIGIN,并在输出窗口中用一个 $ 显示它。但这似乎不起作用。我尝试了几种变体,但没有任何反应。就像链接器只是忽略了标志。我试过:-Wl,-rpath=$ORIGIN -Wl,--rpath=$ORIGIN -Wl,-rpath=/$ORIGIN -Wl,-rpath=$ORIGIN/ -Wl,-rpath=/$ORIGIN/等
    • 使用 elfdump 或本地等效项来查看其中的内容?使用 ldd 看看它说了什么?
    • 上面提到的-rpath \$$ORIGIN怎么样?
    • 做到了,我只是没有正确地转义 $ 字符。能够使用 readelf 检查它有助于确保我得到正确的参数字符串。在 Eclipse 中工作的标志字符串是 -Wl,-rpath=\$$ORIGIN
    【解决方案2】:

    将您的程序包装在一个 shell 脚本中:

    #!/bin/sh
    
    PROGRAM_DIRECTORY="`dirname "$0"`"
    export LD_LIBRARY_PATH="$PROGRAM_DIRECTORY"
    
    "$PROGRAM_DIRECTORY/program_executable" "$@"
    

    如果您运行此脚本(而不是您的可执行文件),您的程序将正常链接。

    【讨论】:

    • 是的,这就是我一直在做的事情,并且有效。该应用程序具有使用 OpenMPI 的并行化版本,并且具有共享 LD_LIBRARY_PATH 的方式。所以我们目前正在使用这种解决方法,但我们希望有一种更简单的处理方式,因为应用程序(以及 MPI 运行器)需要多个标志来处理什么
    • 您可以使用"$@"将脚本中的所有参数传递给程序。
    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多