如何在没有硬编码完整依赖路径的情况下构建共享库(.so)?

Ale*_*man 17 c++ linker gcc shared-libraries

我需要构建两个第三方共享库,因此其他项目将重用其.so文件.但是,在构建之后,这些库中的一个包含到另一个库的硬编码路径.此路径在其他计算机上无效并导致链接器警告.如何防止将完整路径嵌入到生成的.so文件中?

细节:

第一个库源:~/dev/A
第二个库源:~/dev/B

它们都有configure生成make文件的脚本.图书馆B取决于A.所以,首先我建立A:

$ ~/dev/A/configure --prefix=~/dev/A-install
$ make && make install
Run Code Online (Sandbox Code Playgroud)

然后我建立B:

$ ~/dev/B/configure --prefix=~/dev/B-install --with-A=~/dev/A-install
$ make && make install
Run Code Online (Sandbox Code Playgroud)

然后,我要上传的内容~/dev/A-install~/dev/B-install我们的文件服务器,以便其他团队,并建立机可以使用的二进制文件.但是当他们尝试使用时,他们会收到链接器警告B:

/usr/bin/ld: warning: libA.so.2, needed by /.../deps/B/lib/libB.so, not found (try using -rpath or -rpath-link)
Run Code Online (Sandbox Code Playgroud)

当我运行ldd libB.so它时给出:

...
libA.so.2 => /home/alex/dev/A-install/lib/libA.so.2
Run Code Online (Sandbox Code Playgroud)

显然这条路径只存在于我的机器上,在其他机器上找不到.

如何从中删除完整的硬编码路径libB.so

谢谢.

Jan*_*dec 5

您必须使用--prefix运行时环境中对于两个软件包都有效的值!

在安装时,在make命令行上比您在make命令行上覆盖prefixDESTDIRprefix替换前缀,DESTDIR但前缀更前缀,但工作更可靠)。喜欢:

~/dev/A$ ./configure
~/dev/A$ make 
~/dev/A$ make install prefix=~/dev/A-install
~/dev/B$ ./configure --with-A=~/dev/A-install
~/dev/B$ make
~/dev/B$ make install prefix=~/dev/B-install
Run Code Online (Sandbox Code Playgroud)

或(首选,这是所有软件包构建工具使用它的方式):

~/dev/A$ ./configure
~/dev/A$ make 
~/dev/A$ make install DESTDIR=~/dev/A-install
~/dev/B$ ./configure --with-A=~/dev/A-install/usr/local
~/dev/B$ make
~/dev/B$ make install prefix=~/dev/B-install
Run Code Online (Sandbox Code Playgroud)

因为您是通过这种方式安装的~/dev/A-install/$prefix,所以使用默认前缀~/dev/A-install/usr/local。后面这个选项的优点是,如果您重新定义某些特定的安装路径而未引用前缀(例如--sysconfdir=/etc),DESTDIR则仍将在该前缀之前安装,而不会受到的影响prefix