【发布时间】:2017-09-26 12:08:39
【问题描述】:
我正在尝试学习如何在 C++ 程序中构建和使用动态库。一切都很好,当我从终端启动它时我的程序运行良好(我在 mac OS X El Capitan 上)。令人惊讶的是,当我尝试通过单击可执行文件来启动它时,情况并非如此。我收到dyld: Library not loaded: liblibrary.so、Reason: image not found 错误。
我所有的文件都在同一个目录中。我用命令构建它们:
g++ -c -fPIC A.cpp
g++ -c -fPIC B.cpp
g++ -shared -fPIC A.o B.o -o library.so
g++ main.cpp library.so -o Program
提前感谢您的帮助。
我尝试了以下解决方案:
- 在
LD_LIBRARY_PATH和DYLD_LIBRARY_PATH中添加一个路径 - 更改库扩展名:
library.so或library.dylib - 添加 rpath
g++ main.cpp library.so -Wl,-rpath,. -o Program和g++ main.cpp library.so -Wl,-rpath,$HOME/my_dir -o Program
【问题讨论】:
-
当你从命令行运行时,你和
library.so文件在同一个目录吗?这就是系统可以找到该库的原因,因为它在您的当前目录 中。如果它不在 当前目录 中,那么系统需要找到库所在的位置,这可以通过-rpathlinker 选项完成。 -
顺便说一下,您的主应用程序不必使用
-fPIC选项构建,只需使用库即可。 -
是的,我在当前目录中,但我之前尝试
g++ -Wl,-rpath,. main.cpp library.so -o Program链接到我的当前目录,但没有任何改变。 -
rpath 不应该是相对目录,而是一些绝对路径。请编辑您的问题以解释已尝试过的内容
-
在使用一个简单的程序执行您的命令后,
otool报告它指的是“library.so”(即在.中)。使用getcwd(),我可以看到OSX在~中启动双击程序,而不是可执行文件的目录。您需要使您的 rpath 引用相对于@executable_path。