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?
谢谢.
您必须使用--prefix在运行时环境中对于两个软件包都有效的值!
在安装时,在make命令行上比您在make命令行上覆盖prefix或DESTDIR(prefix替换前缀,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。
| 归档时间: |
|
| 查看次数: |
10350 次 |
| 最近记录: |