我有一个依赖于libB.so的libA.so,libB.so位于../libB/(从libA.c开始)。我想以这样的方式编译东西,使我不必设置任何环境变量。我有:
cc -std=c99 -c -fPIC -I../libB/ -Wall libA.c
cc -std=c99 -shared libA.o -L../libB -lB -o libA.so
这段代码编译通过。当我运行使用dlopen加载libA的程序时,出现如下错误:
dyld: Library not loaded: libB.so
Referenced from: libA/libA.so
Reason: image not found
Trace/BPT trap: 5
所以libA在运行时找不到libB。我发现这个解决方案可以在Mac OS X上更改运行时路径:
install_name_tool -change libB.so @loader_path/../libB.so libA.so
但我想找到一个适用于OS X和Linux的解决方案。再次强调,我尽量让最终用户做尽可能少的事情,因此不希望他们设置环境变量,并且我必须使用cc(对我来说是Apple LLVM版本4.2(clang-425.0.27)(基于LLVM 3.2svn),并且我希望它也适用于Linux,因此在那里cc = gcc)。
编辑 我的问题可能比我意识到的要复杂。我正在用C制作这个动态库,但尝试从python中使用它。我可以在python中轻松使用没有依赖关系的libB.so,当我从python中加载libA.so时,它会找到它(请参见上面的错误),只是此时libA.so意识到它不知道在哪里找到libB.so。如果我正确理解下面的答案,解决方案取决于在编译可执行文件时设置链接器路径,在我的情况下在python中进行。
在编译它时有没有办法告诉libA.so在哪里查找libB.so?我可以在OSX上使用install_name_tool随后进行操作,但是否没有使用编译器的适用于OSX和Linux的方法?
sudo yum install chrpath
。基本上,如果在每个平台上以相应的方式构建它,您的最终用户将不需要做任何事情,只需下载和运行即可。 - bgstech