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

clang, linux, is there an option to change shared library name at linking?

我正在测试一个有点非常规的项目布局和 rake 作为 make 实用程序。有一条规则是从不同目录中的源文件编译二进制文件,并使用共享库 link 它们。这个规则是来自项目根目录的运行。例如规则是这样的:

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]
...

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

不确定是否对您有帮助。但是当我尝试编译一些狗屎时,我不知道什么标志。我用 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 link 它,并且此输出中有可选参数。

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

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