加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何构建一个没有硬编码的完全依赖路径的共享库(.so)?

发布时间:2020-12-16 05:40:04 所属栏目:百科 来源:网络整理
导读:我需要建立两个第三方共享库,所以他们的.so文件将被其他项目重用.但是,构建这些库之后,包含硬编码的路径到另一个.此路径在其他机器上无效,并导致链接器警告.如何阻止完整路径嵌入到生成的.so文件中? 细节: 第一个库源码:?/ dev / A 第二库源:?/ dev / B
我需要建立两个第三方共享库,所以他们的.so文件将被其他项目重用.但是,构建这些库之后,包含硬编码的路径到另一个.此路径在其他机器上无效,并导致链接器警告.如何阻止完整路径嵌入到生成的.so文件中?

细节:

第一个库源码:?/ dev / A
第二库源:?/ dev / B

他们都配置脚本来生成make文件.图书馆B依赖于A.所以,首先我建立A:

$~/dev/A/configure --prefix=~/dev/A-install
$make && make install

然后我建立B:

$~/dev/B/configure --prefix=~/dev/B-install --with-A=~/dev/A-install
$make && make install

然后我想将?/ 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)

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

...
libA.so.2 => /home/alex/dev/A-install/lib/libA.so.2

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

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

谢谢.

解决方法

您必须使用–prefix值,这两个包将在运行时环境中有效!

比安装时,在make命令行上覆盖前缀或DESTDIR(前缀替换前缀,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

或(这是首选,并且是所有包装构建工具如何使用它):

~/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

因为这样你要安装到?/ dev / A-install / $prefix,所以默认前缀?/ dev / A-install /usr/local.这个后续选项的优点是,如果您重新定义一些特定的安装路径而不引用前缀(例如–sysconfdir = / etc),则DESTDIR仍然会被添加到前缀中,而不会受到前缀的影响.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读