我正在尝试学习如何在 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
g++ main.cpp library.so -Wl,-rpath,. -o Program
和 g++ main.cpp library.so -Wl,-rpath,$HOME/my_dir -o Program
终于,我找到了解决办法。实际上,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
该库可以跟随可执行文件。
感谢您的帮助。