无法运行程序通过点击它,而我可以从终端
问题描述:
我想学习如何建立和使用动态库在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
- 更改库extention:
library.so
或library.dylib
- 添加rpath的
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
库可以按照执行。
感谢您的帮助。
从命令行运行时,是否与'library.so'文件位于同一目录中?这就是为什么系统可以找到该库,因为它位于*当前目录*中。如果它不在*当前目录中,那么系统需要通过['-rpath'](https://en.wikipedia.org/wiki/Rpath)**链接器来查找库的位置。 * 选项。 –
顺便说一下,您的主应用程序不必使用'-fPIC'选项构建,而只需使用库。 –
是的,我在当前目录中,但我以前试过'g ++ -Wl,-rpath ,. main.cpp library.so -o程序“链接到我的当前目录,没有任何改变。 – kipgon