2017-02-03 38 views
9

我正在嘗試做一些非常簡單和典型的事情,這是在我的Xcode項目中使用動態鏈接庫,然後部署所有必要的庫嵌入。使Xcode嵌入必要的dylibs

但是我一定在做錯誤的方式,因爲Xcode 8不允許我嵌入.dylib文件,只有框架!下面的圖片是當我嘗試向Embedded Binaires添加任何東西時發生的情況,dylib沒有顯示,添加其他...將它們添加到項目中,但不添加到嵌入式二進制文件中。

Xcode not allowing me to add any of the dylibs as embedded binaries

必須有一個非常簡單的方法來做到這一點,但我無法找到它...

尾聲

因此很明顯,因爲我需要運行腳本,調用install_lib_tool我做了一個非常通用的腳本,它將改變其路徑中嵌入的副本的路徑/local/

#!/bin/sh 

app=$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH 
fw_path=$BUILT_PRODUCTS_DIR/$FRAMEWORKS_FOLDER_PATH 
app_dyl_list=(`ls $fw_path | grep dylib`) 

function change_paths { 
    local bin=$1 
    echo change_path $bin 
    dyl_list=(`otool -L $bin | grep local | awk '{print $1}'`) 

    for dyl in ${dyl_list[*]}; do 
     libname=$(basename $dyl) 
     libname=${libname%%.*} 
     actual_libname=(`ls $fw_path | grep $libname | xargs basename`) 
     install_name_tool -change $dyl "@executable_path/../Frameworks/$actual_libname" $bin 
     printf "\t%s edited\n" $actual_libname 
    done 
} 

change_paths $app 
for dyl_bin in ${app_dyl_list[*]}; do 
    change_paths $fw_path/$dyl_bin 
done 

然後,只需在複製dylib之後添加一個運行腳本步驟以僅使用不帶參數運行(環境變量包含所需的所有內容)即可。

回答

11

我從來沒有使用過「嵌入式庫」,而是複製階段來複制所有需要的第三方庫以及由項目中各個目標創建的庫。您可以簡單地將您想要從「框架」和「產品」輪廓節點複製的dylib拖入該複製階段(或通過「+」按鈕添加它們)。 Xcode同樣會自動登錄每個lib下,如果這是啓用(這是默認設置):

enter image description here

也看看「安裝目錄」設置。您應該將此值設置爲@executable_path /../ Frameworks(前提是這是您的實際框架文件夾,至少這是推薦的文件夾)。該值使用的XCode設置你的dylib的ID,是必須的,使他們正確地進行負載

enter image description here

您也可以使用像MacDependency一個工具來檢查你的.app.dylib.framework包的詳細信息。它還會告訴你圖書館依賴哪些其他dylib以及它期望的路徑。該路徑必須與鏈接庫的ID相同,否則加載將失敗。

另一個非常有用的工具是otool,它帶有XCode。它提供了類似MacDependency等信息。下面是與它預期的路徑和版本dylib依賴列表:

Mikes-iMac:Debug mike$ otool -L libcdbc.dylib 
libcdbc.dylib: 
    @executable_path/../Frameworks/libcdbc.dylib (compatibility version 1.0.0, current version 1.0.0) 
    @executable_path/../Frameworks/libwbbase.dylib (compatibility version 1.0.0, current version 1.0.0) 
    @executable_path/../Frameworks/libgrt.dylib (compatibility version 1.0.0, current version 1.0.0) 
    @executable_path/../Frameworks/libgmodule-2.0.0.dylib (compatibility version 3401.0.0, current version 3401.2.0) 
    @executable_path/../Frameworks/libgthread-2.0.0.dylib (compatibility version 3401.0.0, current version 3401.2.0) 
    @executable_path/../Frameworks/libglib-2.0.0.dylib (compatibility version 3401.0.0, current version 3401.2.0) 
    @executable_path/../Frameworks/libmysqlcppconn.7.1.1.8.dylib (compatibility version 7.0.0, current version 7.1.1) 
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.4.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0) 

約裝載機路徑的另一個討論是在這裏:How to set dyld_library_path in Xcode

如果您創建的應用程序或庫需要系統位置而不是相對位置的dylib,那麼這可能意味着您將錯誤的lib鏈接到它。在「鏈接二進制」構建階段,您可以選擇要鏈接的庫,選擇對話框將列出您的所有項目目標。此外,對於鏈接器列表,您可以簡單地將dylib從項目大綱的「產品」節點拖入其中以進行設置。同樣對於這樣的庫,設置適當路徑的要求也是成立的。您可以使用腳本在複製階段後更改ID,或者將這些庫的副本保存在其他位置,更改一次它們的ID(例如,在您下載它們之後)並將它們從那裏複製到最終應用程序。

+0

我試過了,可悲的是,在啓動應用程序時,它仍在尋找原始/ usr/local/lib /位置中的dylib,忽略嵌入的dylib並無法正常啓動。你知道如何解決這個路徑問題嗎? –

+0

更新了我的答案。希望有所幫助。 –

+0

謝謝,但是這仍然不起作用,dylibs得到正確複製,但路徑保持不變,請參閱此屏幕截圖http://i.imgur.com/nuN3o3w.png –