2017-09-26 123 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

然後請編輯您的問題,以解釋究竟是什麼嘗試過 –