【发布时间】:2015-06-07 23:28:59
【问题描述】:
我有一个依赖于 libB.so 的 libA.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 上都可以工作吗?
【问题讨论】:
标签: linux macos shared-libraries dynamic-linking cc