2011-02-07 31 views
11

我的應用程序,其中包括我開發了一個外部庫,我編譯使用該設備作爲目標,每次我得到以下警告消息:如何擺脫警告「文件建立了不支持的文件格式」與靜態庫鏈接時?

MYLIB釋放小iphonesimulator.a,文件 是爲不支持的文件格式 而建立的,而不是與 鏈接的架構(armv7)。

我有兩個版本的庫,都添加到項目中。一個爲iphonesimulator構建,另一個爲iphoneos構建。

即使它適用於任何目標(似乎編譯器根據目標採用正確版本的庫)那種警告變得厭惡。

有沒有辦法擺脫這個警告,或者甚至更好地在單個庫上編譯兩個平臺,避免在同一個庫中有兩個二進制文件?

謝謝!

回答

30

你不想得到rid這個錯誤,你想要修復吧。

這裏的問題是,你要鏈接一個模擬器版本的庫到設備構建應用程序的。模擬器需要i386架構中的庫,而設備需要armv6或armv7架構中的東西。

所以這裏的解決方案是鏈接正確版本的庫。

我通常所做的就是將它們合併成一個庫,並讓鏈接器爲我選擇合適的版本。下面是你在終端做什麼:

$ cd /path/to/my/libraries 
$ ls 
    libMyLibrary-Device.a 
    libMyLibrary-Simulator.a 
$ file libMyLibrary-Device.a 
    libMyLibrary-Device.a: Mach-O universal binary with 2 architectures 
    libMyLibrary-Device.a (for architecture armv6): current ar archive random library 
    libMyLibrary-Device.a (for architecture armv7): current ar archive random library 
$ file libMyLibrary-Simulator.a 
    libMyLibrary-Simulator.a: Mach-O universal binary with 1 architecture 
    libMyLibrary-Simulator.a (for architecture i386): current ar archive random library 
$ lipo -create -output libMyLibrary.a libMyLibrary-Device.a libMyLibrary-Simulator.a 
$ ls 
    libMyLibrary-Device.a 
    libMyLibrary-Simulator.a 
    libMyLibrary.a 
$ file libMyLibrary.a 
    libMyLibrary.a: Mach-O universal binary with 3 architectures 
    libMyLibrary.a (for architecture armv6): current ar archive random library 
    libMyLibrary.a (for architecture armv7): current ar archive random library 
    libMyLibrary.a (for architecture i386): current ar archive random library 

然後你只需鏈接libMyLibrary而不是設備或模擬器版本,鏈接器將做正確的事情。

+0

這正是我所期待的。非常感謝! – 2011-02-07 13:38:13

+0

謝謝。當你爲iPhone模擬器建立在哪個位置是靜態庫,但? – huggie 2012-04-02 04:25:43

0

如果您不想因爲某種原因合併這些庫(如擁有一個調試庫和一個發佈庫),您可以根據您的構建目標來包含不同的庫。

如果您打開項目信息(右鍵單擊項目 - >獲取信息或突出顯示並單擊信息按鈕),然後進入鏈接部分,突出顯示其他鏈接器標誌,然後單擊齒輪上的屏幕的左下角的其中一個選項是添加生成設置條件。點擊它會給你一個兒童選項,在其他鏈接器標誌下,默認情況下,任何SDK和任何體系結構下拉列表中有一個空行。從那裏你可以設置具體的鏈接器標誌(-lmylib-release-iphonesimulator等),具體取決於各種構建設置。

5

我與SQLite 3庫(libsqlite3.dylib)有同樣的問題。我打開了一個較舊的項目並編譯了相同的庫。我比較了每個項目上的目標信息>構建設置>搜索路徑,而舊的(工作)項目爲空時,新項目中的「框架搜索路徑」中有多個搜索路徑。刪除所有這些解決了問題。希望這可以幫助某人,這讓我花了很多很多時間才弄清楚。