我有一个libA.so,这取决于libB.so,它位于../libB/(来自libA.c)。我试图以这样的方式编译东西,我不必设置任何环境变量。我有:如何设置.so库将搜索其他.so库的路径?
cc -std=c99 -c -fPIC -I../libB/ -Wall libA.c
cc -std=c99 -shared libA.o -L../libB -lB -o libA.so
这个编译得很好。当我运行加载力霸使用dlopen我得到一个程序:
dyld: Library not loaded: libB.so
Referenced from: libA/libA.so
Reason: image not found
Trace/BPT trap: 5
所以力霸不会在运行时发现libB。我发现这个解决方案来改变Mac OS X上运行时路径:
install_name_tool -change libB.so @loader_path /../ libB.so libA.so
,但我想找到一个解决方案,可以在OS X和Linux上运行。再一次,我试图让最终用户尽可能少做,所以我不希望他们必须设置环境变量,我必须使用cc(对我来说,这是我的Apple LLVM版本4.2(铿-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上工作吗?
感谢您的帮助。当我man cc时,我没有看到rpath的任何选项。不幸的是我不得不使用cc。有任何想法吗? – Dan 2015-04-03 19:40:04
当你说“cc”时,你需要更具体。 “cc”取决于系统。在Linux上它通常只是一个“gcc”的链接。无论如何,“rpath”是一个链接器选项,不是编译器选项。因此请阅读:man ld – kaylum 2015-04-03 20:05:46
如果不清楚。使用gcc(也可能是cc)选项可以通过-Wl选项传递给链接器。 – kaylum 2015-04-03 20:29:43