(我宁愿拥有
[foo.sh],[lib/foo.sh]但稍后再解决)。
大部分问题是您的:
/名称中的阻止了动态链接器执行rpath魔术。
(您的rpath也是错误的。考虑一下:从shell程序中,如果您当前位于可执行文件所在的目录中,您将如何到达库所在的目录?在这里,您需
cd../lib要这样做。因此,您的rpath应该是
$ORIGIN/../lib。)
如果您将对象构建为
libfoo.so并与链接
-Llib-lfoo,则链接器将确定您的意图,并做正确的事情。但是,如果您要使用不同寻常的命名约定,则必须提供帮助:
- 更改库的链接行,以将您的库的SONAME显式设置为just
foo.sh
:
g++ -shared -Wl,-soname,foo.sh -o lib/foo.sh obj/foo.o
- 修复rpath:
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../lib' -Llib -l:foo.sh
奔跑
ldd main/main.run看看发生了什么,这很有用。在最初的失败案例中,您会看到类似以下内容的信息:
lib/foo.sh (0xNNNNNNNN)
(缺少任何
=> /some/resolved/path表明未完成任何路径解析的信息)。在固定情况下,您会看到类似以下内容的内容:
foo.sh => /your/path/to/run/../lib/foo.sh (0xNNNNNNNN)



