当我可以从终端运行程序时,不能通过单击它来运行程序 我试图学习如何在C++程序中建立和使用动态库。当我从终端启动它时,一切都很好,我的程序运行良好(我在MacOSX El Capitan上)。令人惊讶的是,当我试图通过单击可执行文件来启动它时,情况并非如此。我得到一个dyld:liblibrary未加载:libliblibrary。因此,原因:未找到图像错误
我所有的档案都在同一个档案库里。我使用命令构建它们:当我可以从终端运行程序时,不能通过单击它来运行程序 我试图学习如何在C++程序中建立和使用动态库。当我从终端启动它时,一切都很好,我的程序运行良好(我在MacOSX El Capitan上)。令人惊讶的是,当我试图通过单击可执行文件来启动它时,情况并非如此。我得到一个dyld:liblibrary未加载:libliblibrary。因此,原因:未找到图像错误,c++,macos,dynamic,lib,C++,Macos,Dynamic,Lib,我所有的档案都在同一个档案库里。我使用命令构建它们: 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\u LIBRARY\u PATH和DYLD\u LIBRARY\u PATH 更改库扩展名:library.so或library.dylib 添加一个rpathg++ma
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\u LIBRARY\u PATH
DYLD\u LIBRARY\u PATH
- 更改库扩展名:
或library.so
library.dylib
- 添加一个rpath
和g++main.cpp library.so-Wl,-rpath-o程序
g++main.cpp library.so-Wl,-rpath,$HOME/my_dir-o程序
g++-Wall-Wl,-rpath,$HOME/yourdir main.cpp library.so-o程序),或者设置一些DYLD\u库路径,请参阅。你可能需要一个.dylib
后缀,而不是.so
后缀
(我再也没有MacOSX了,所以我忘记了细节)最后,我找到了解决方案。实际上,macOS的动态库创建是不同的。我从一开始就尝试的只是Linux
因此,Mac解决方案是:
g++ -dynamiclib -install_name "absolute_path/library.dylib" A.o B.o -o library.dylib
其中:
-dynamiclib
是-shared
的Mac等价物
-安装\u name“absolute\u 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
然后,库可以跟随可执行文件
谢谢您的帮助。当您从命令行运行时,您是否与库位于同一目录下。因此
文件?这就是为什么系统可以找到库,因为它在您当前的目录中。如果它不在当前目录中,则系统需要找到库的位置,这是通过链接器选项完成的。顺便说一下,您的主应用程序不必使用-fPIC
选项构建,只需使用库。是的,我在当前目录中,但我以前尝试过g++-Wl,-rpath,。main.cpp library.so-o程序
链接到我的当前目录,但没有任何更改。rpath不应是相对目录,而应是某个绝对路径。请编辑您的问题,以解释在使用一个简单的程序执行命令后尝试了什么,otool
报告它引用了“library.so”(即在
中)。使用getcwd()
,我可以看到OSX在~
中启动双击程序,而不是启动可执行文件的目录。您需要使您的rpath引用相对于@executable\u path
。我尝试了所有这些解决方案,但没有一个对我有效。然后请编辑您的问题,解释到底尝试了什么