1

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

为了演示这种行为,只需要一个目录下的共享库。

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.so而不是mylib.so,则可以创建此输出,如下所示:

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

这也会根据需要删除 ldd 列表中的路径some/dir

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

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

谢谢你的时间,我希望我已经合理地解释了这个问题。

乔恩。

4

2 回答 2

1

尝试在您的共享库中添加soname :

$ 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)
于 2013-06-25T13:41:40.780 回答
0

您可以将一个魔术变量传递给 rpath 来执行此操作:$ORIGIN. 详情请参阅man ld.so

我认为在您的情况下,该命令应如下所示(未经测试):

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

请注意,您不能让外壳扩展$ORIGIN为外壳变量。

顺便说一句,这是“rpath relative”的第一个谷歌命中。

于 2013-01-04T10:01:48.953 回答