2015-04-22 70 views
1

我使用g ++從OS X中的命令行構建而不使用XCode。當我構建我的可執行文件時,我必須將鏈接器標誌包含到存儲動態庫的庫中,但是當我去運行可執行文件時,沒有找到動態庫,並且出現錯誤dyld: Library not loaded: (foo)dyld:Library未加載:在OS X上

關於與特定軟件包相關的動態庫以及如何獲取內置於XCode項目中的動態庫,還沒有一個通用的解釋了Mac OS X如何查找動態庫以及如何獲取新的.dylib到可執行文件的搜索路徑中。

有人可以填補這一空白。當用可執行文件構建Mac OS X時,如何查找動態庫,以及如何將我的動態庫鏈接放在正確的位置以便可執行文件運行?

我在OSX 10.9 - 小牛隊。

+0

看到這個問題:http://stackoverflow.com/questions/10359063/dyld-library-not-loaded-opt-local-lib-libglib-2-0-0-dylib?rq=1和Apple主題在其答案中引用:https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/DynamicLibraries/000-Introduction/Introduction.html –

回答

2

一個很好的開始將是蘋果的文檔Dynamic Library Programming Topics 特別是Run-Path Dependent Libraries

「當動態加載程序(dyld)加載可執行文件時,它會按照鏈接時指定的順序在運行路徑搜索路徑中查找與運行路徑相關的庫。」

先覺得是使用二進制otool檢查庫的依賴關係爲您提供:

otool -L /path/to/binary 

然後,這取決於你想如何分配你的圖書館有不同的解決方案。

您可以在二進制文件中指定庫的絕對路徑。它應該用一個工具來完成,例如CMake。否則,你可以使用

install_name_tool to change the path to a library by hand. 

大多數時候,你想部署你的二進制文件,並把dylibs放在一個單獨的文件夾中。這些庫相對於二進制文件的位置加載。 例如:

@loader_path/../Frameworks/Sparkle.framework/Versions/A/Sparkle 

關於路徑的更多信息,我建議你閱讀this blog

+0

我很欣賞鏈接到動態庫編程主題的文章。 'install_name_tool'和我最終做了什麼之間的區別是手動建立一個到'/ usr/local/lib /'文件夾中的庫的sym鏈接? – ZacSketches

+0

庫的路徑是自己寫的,這就是爲什麼你安裝之後永遠不應該移動dylib。做一個符號鏈接是騙你的鏈接器,因爲你的dylib有路徑問題。它的作品,但它是一個黑客。你可以將你的lib文件夾添加到相應的環境變量中。檢查此鏈接http://superuser.com/questions/282450/where-do-i-set-dyld-library-path-on-mac-os-x-and-is-it-a-good-idea – Kikohs

相關問題