使用gcc强制solib依赖项在目录下具有非标准命名共享库的相对路径



我有一个关于在几个目录下链接具有非标准命名约定的共享库的问题。我需要生成的可执行文件在可执行文件当前位置搜索共享库,但找不到命令行参数来强制执行此行为。

要演示此行为,所需要的只是一个目录下的共享库。

gcc -shared mylib.c -o some/dir/mylib.so
gcc main.c -o main -Lsome/dir -l:mylib.so

可执行文件main给出如下ldd输出:

ldd main
     some/dir/mylib.so (0xf76e2000)

我需要的输出是:

ldd main
     mylib.so => some/dir/mylib.so (0xf7700000)

如果库按惯例命名为libmylib,则可以创建此输出。所以而不是mylib。So like So

mv some/dir/mylib.so some/dir/libmylib.so
gcc main.c -o main -Lsome/dir -lmylib

这也会根据需要删除路径中的一些/dir

我已经研究了rpath的使用,以及ld和gcc的命令行选项,但我无法找到一个令人满意的解决方案。在这种情况下,对非标准名称和目录结构的严格要求不能轻易改变。

我的问题是如何通过gcc命令行选项强制库的依赖关系相对于当前目录,而不是像第二个ldd那样绝对。

感谢您的宝贵时间,我希望我已经合理地解释了问题。

Jon。

尝试在共享库中添加sonname:

$ gcc -shared mylib.c -o some/dir/mylib.so -Wl,-soname=mylib.so
$ gcc main.c -o main -Lsome/dir -l:mylib.so
$ LD_LIBRARY_PATH=some/dir:$LD_LIBRARY_PATH ldd main
        mylib.so => some/dir/mylib.so (0x00007fa7a4fd6000)

您可以将一个神奇变量传递给rpath来完成此操作:$ORIGIN。详见man ld.so

我认为在你的情况下,命令应该是这样的(未经测试):

gcc main.c -o main -Lsome/dir -lmylib -Wl,-rpath,'$ORIGIN/some/path'

注意,不能让shell将$ORIGIN扩展为shell变量。

顺便说一句,这是谷歌第一次搜索"rpath relative"

最新更新