今天新任務需要用到一個framework,但是build出來執行的時候一直報:dyld: Library not loaded
百度google嘗試了N多方法都不work,果然一千人就有一千個哈姆雷特,沒想到連問題都會這樣。
解決方案:
首先,導致這個錯誤最直接的原因是,你沒有在你的項目里面link你需要的library資源,確保你有做link的動作。
當link動作做了之后,如果還出現問題,那么我們先看錯誤提示,首先,要明確一點,為什么會提示rpath下的framwork not loaded?
看起來問題就是出在path的地方不match,我一開始有針對這個路徑問題去嘗試解決,但是都不work.
嘗試 一:
-
單純設定framework search paths, build出來就直接報錯,image not fond.
-
嘗試在general里面,選擇framework將其改為embed witout signing.可以build,但是執行的時候依舊報錯。
這樣看起來問題是,我build出來的執行檔執行期間run的path 跟我default設定的不一樣,因為我一開始有嵌入framework所以它可以成功執行build出來。
嘗試 二:
- 單純設定runpath search paths,發現報錯,提示接口文件not found
讓我萬萬沒想到的是,當我嘗試將run path search path 和 framework search path 均設定指定路徑的時候,竟然可以build出來執行了,也不需要我一開始將framework 嵌入到project里的動作即可。
總結:
-
在使用靜態庫framework的時候,一定要設置Runpath search path 和Framework search path,這2個地方分別作用於:程序執行后(build出來執行),和執行前所load的環境(build所需要的環境),不管你是通過嵌入的方式讓他可以build執行還是其他方法, 這2處地方的path 一定要設定。
-
在調用dylib的時候,也需要注意path的設定。一般我們會在Run Scipt里面做一個path 加載設定。腳本如下:
1. install_name_tool -change @rpath/xxx.dylib @executable_path/xxx.dylib $BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH
2. manually copy xxx.dylib to the same directory where the CLI is.