我只是在这里做了一个使用 ld-rpath
选项的基本示例(有关工作版本,请参阅第二个响应)。我正在尝试创建一个示例,其中链接到,然后链接到,全部使用and 。$ORIGIN
main.run
foo.so
bar.so
rpath
$ORIGIN
运行时文件结构是:
- 项目/
- 库/
- 目录/
- 子/
- 吧.so
- foo.so
- 跑/
- main.run(构建失败)
我正在构建 foo.so 使用:
g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/dir/foo.so obj/foo.o -Wl,-soname,foo.so -Wl,-rpath,'$ORIGIN/sub' -Llib/dir/sub -l:bar.so
哪个构建得很好。ldd lib/dir/foo.so
甚至可以找到bar.so
。
但是,当我尝试链接main.run
到时foo.so
,foo.so
找不到 bar.so。
我正在构建 main.so 使用:
g++ -c -o obj/main.o src/main.cpp
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../lib/dir' -Llib/dir -l:foo.so
foo.so
如果使用不递归链接的另一个版本,这很好用。(在下面的项目中取消注释 make.sh 中的行以进行测试)。
但是,使用正常foo.so
我在构建时遇到此错误main.run
:
/usr/bin/ld:警告:bar.so,lib/dir/foo.so 需要,未找到(尝试使用 -rpath 或 -rpath-link)
所以我的问题是:
- 在 foo.so 内是否
$ORIGIN
解析为project/lib/dir
(wherefoo.so
is) 或project/run
(wheremain.run
(the executable linking it) is)?
ldd 似乎表明它是project/lib/dir
,这似乎是最好的方法(尽管我尝试假设两者)。 - 我如何让这些链接(同时保留可重定位性) - 最好不使用
-rpath-link
.
您可以在此处下载该项目。这就像我能做到的一样简单。4 个短源和一个脚本。
提取后,只需./make.sh
从内部运行project/
。
注意:我正在使用-l:
. 这不应该改变任何东西,除了库被命名为 likefoo.so
而不是,并且与而不是libfoo.so
lunk 。-l:foo.so
-lfoo