我正在尝试学习如何在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
答案 0 :(得分:3)
您可能需要在编译时给出明确的rpath(作为绝对路径,而不是相对路径)(例如使用g++ -Wall -Wl,-rpath,$HOME/yourdir main.cpp library.so -o Program
),或设置一些DYLD_LIBRARY_PATH
,请参阅{ {3}}。您可能需要.dylib
后缀,而不是.so
后缀。
(我没有任何MacOSX,所以我忘记了细节)
答案 1 :(得分:1)
最后,我找到了解决方案。实际上,动态库创建对于macOS是不同的。我从一开始就尝试的只是为Linux工作。
所以Mac解决方案是:
g++ -dynamiclib -install_name "absolute_path/library.dylib" A.o B.o -o library.dylib
其中:
-dynamiclib
是-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
然后,库可以跟随可执行文件。
感谢您的帮助。