gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:22:04 27 4
gpt4 key购买 nike

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

详情:

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

它们都有 configure 脚本来生成 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的内容上传到我们的文件服务器,以便其他团队和build机器可以使用二进制文件。但是当他们尝试使用 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 值,该值将在 runtime 环境中对两个包都有效!

比你覆盖 prefixDESTDIR (prefix 替换前缀,DESTDIR 是前置的,但是安装时在 make 命令行上工作更可靠)。喜欢:

~/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 仍将被添加到它,虽然它不会受到prefix的影响。

关于c++ - 如何在没有硬编码的完整依赖路径的情况下构建共享库(.so)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7911752/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com