- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我需要构建两个 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 环境中对两个包都有效!
比你覆盖 prefix
或 DESTDIR
(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/
我是一名优秀的程序员,十分优秀!