2017-09-26 44 views
2

我想学习如何建立和使用动态库在c + +程序。一切都很好,当我从终端(我在Mac OS X El Capitan上)启动它时,我的程序运行良好。令人惊讶的是,当我尝试点击可执行文件来启动它时,情况并非如此。我收到一个dyld: Library not loaded: liblibrary.soReason: 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_PATHDYLD_LIBRARY_PATH
  • 更改库extention:library.solibrary.dylib
  • 添加rpath的g++ main.cpp library.so -Wl,-rpath,. -o Programg++ main.cpp library.so -Wl,-rpath,$HOME/my_dir -o Program
+2

从命令行运行时,是否与'library.so'文件位于同一目录中?这就是为什么系统可以找到该库,因为它位于*当前目录*中。如果它不在*当前目录中,那么系统需要通过['-rpath'](https://en.wikipedia.org/wiki/Rpath)**链接器来查找库的位置。 * 选项。 –

+1

顺便说一下,您的主应用程序不必使用'-fPIC'选项构建,而只需使用库。 –

+0

是的,我在当前目录中,但我以前试过'g ++ -Wl,-rpath ,. main.cpp library.so -o程序“链接到我的当前目录,没有任何改变。 – kipgon

回答

1

最后,我找到了解决办法。实际上,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.cpplibrary.dylib在同一个目录下。

只要library.dylib停留在相同的地方,程序就可以在系统中的任何地方使用。

继@Ssswift的评论,相对路径连接可以使用以下命令来实现:然后

g++ -dynamiclib -install_name "@executable_path/library.dylib" A.o B.o -o library.dylib 

库可以按照执行。

感谢您的帮助。

3

您可能需要提供一个明确的rpath(作为绝对路径,而不是相对路径)。与g++ -Wall -Wl,-rpath,$HOME/yourdir main.cpp library.so -o Program),或设置一些DYLD_LIBRARY_PATH,请参阅this。您可能需要一个.dylib后缀,而不是一个.so之一。

(我没有任何MacOSX的了,所以我忘了细节)

+0

我尝试了所有这些解决方案,但都没有为我工作。 – kipgon

+0

然后请编辑您的问题,以解释究竟是什么尝试过 –