2

我正在尝试学习如何在 C++ 程序中构建和使用动态库。一切都很好,当我从终端启动它时我的程序运行良好(我在 mac OS X El Capitan 上)。令人惊讶的是,当我尝试通过单击可执行文件来启动它时,情况并非如此。我得到一个错误dyld: Library not loaded: liblibrary.soReason: 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_PATHDYLD_LIBRARY_PATH
  • 更改库扩展名:library.solibrary.dylib
  • 添加一个 rpathg++ main.cpp library.so -Wl,-rpath,. -o Programg++ main.cpp library.so -Wl,-rpath,$HOME/my_dir -o Program
4

2 回答 2

3

您可能需要在编译时(例如 with )给出明确的rpath(作为绝对路径,而不是相对路径g++ -Wall -Wl,-rpath,$HOME/yourdir main.cpp library.so -o Program),或者设置一些DYLD_LIBRARY_PATH,请参阅this。你可能需要一个.dylib后缀,而不是.so一个。

(我没有任何MacOSX了,所以我忘记了细节)

于 2017-09-26T12:14:20.170 回答
1

最后,我找到了解决方案。实际上,macOS 的动态库创建是不同的。我从一开始就尝试的方法只适用于 Linux。

所以Mac的解决方案是:

g++ -dynamiclib -install_name "absolute_path/library.dylib" A.o B.o -o library.dylib

在哪里:

  • -dynamiclib是 Mac 的等价物-shared
  • -install_name "absolute_path/library.dylib"为链接器创建一个别名,library.dylib这是使用library.dylib.

之后,传统的命令:

g++ main.cpp library.dylib -o Program

main.cpp如果和library.dylib位于同一目录中,则创建可执行文件。

只要library.dylib在同一个地方,该程序就可以在系统中的任何地方使用。

根据@Ssswift 的注释,可以使用以下命令实现相对路径链接:

g++ -dynamiclib -install_name "@executable_path/library.dylib" A.o B.o -o library.dylib

然后该库可以跟随可执行文件。

谢谢你的帮助。

于 2017-09-27T08:32:54.297 回答