clang,linux,是否有选项可以在链接时更改共享库名称?

时间:2017-12-03 23:04:25

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

我正在测试一个非传统的项目布局,rake作为make实用程序。有一个规则从不同目录中的源文件编译二进制文件,并将它们与共享库链接。此规则从项目的根目录运行。例如,规则是这样做的:

clang -I libs/ -o tests/sourcefile2 tests/sourcefile2.c shared_libs/libFoo.so

结果我得到了二进制文件中的完整路径shared_libs/libFoo.so

readelf -d tests/sourcefile2
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [shared_libs/libFoo.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
...

我想把它改成'libFoo.so',就像这样:

readelf -d tests/sourcefile2
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libFoo.so]
...

然后我可以根据需要为动态链接器设置RPATH,这样可以提供一些灵活性。但我找不到相应的选项或类似的例子。你能建议怎么办吗?我应该只使用临时目录进行构建,复制所有内容并在那里编译吗?

2 个答案:

答案 0 :(得分:2)

不确定它是否对您有所帮助。但是当我尝试编写一些狗屎时,我不知道是什么标志。我使用pkg-config

例如,编译使用Xlib的程序

pkg-config -cflags -libs x11

,输出如下

-I/usr/X11R7/include -D_REENTRANT -Wl,-rpath,/usr/X11R7/lib -L/usr/X11R7/lib -lX11

请注意,这在系统上有所不同,例如NetBSD强制我将其与rpath链接,并且此输出中有可选参数。

所以我复制pkg-config的输出并编译。

答案 1 :(得分:1)

如果您使用'ld'作为链接器,则应该可以使用“-Wl,-soname”。