Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我可以从终端运行程序时,不能通过单击它来运行程序 我试图学习如何在C++程序中建立和使用动态库。当我从终端启动它时,一切都很好,我的程序运行良好(我在MacOSX El Capitan上)。令人惊讶的是,当我试图通过单击可执行文件来启动它时,情况并非如此。我得到一个dyld:liblibrary未加载:libliblibrary。因此,原因:未找到图像错误_C++_Macos_Dynamic_Lib - Fatal编程技术网

当我可以从终端运行程序时,不能通过单击它来运行程序 我试图学习如何在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
。我尝试了所有这些解决方案,但没有一个对我有效。然后请编辑您的问题,解释到底尝试了什么