2011-03-31 51 views
1

我試圖從OSX到iOS交叉編譯幾個庫。我已經成功交叉編譯libjpeg和libogg。交叉編譯Makefile:處理測試程序

但我無法編譯libvorbis,因爲configure堅持創建並運行一個小測試程序。這顯然失敗了,因爲它創建了一個armv7二進制文件,無法運行它,然後將其解釋爲丟失的ogg庫。

您通常如何處理這類問題?我試圖破解配置腳本來解決這些問題,但由於這種失敗,某些功能可能會被禁用。我也想讓configure生成一個本地的Makefile,然後將其轉換爲使用iOS工具鏈,但這似乎太容易出錯。

有什麼建議嗎?

+0

哪個檢查失敗? – kanaka 2011-03-31 19:28:13

+0

檢查oggpackB_read ......沒有 配置:錯誤:新版本libogg(1.1或更高版本)需要 – ggambett 2011-04-01 13:37:41

+0

的config.log說 LD:警告:目錄 '$ {exec_prefix}/lib目錄' 以下-L找不到 LD:警告:在/usr/local/lib/libogg.dylib中,文件是爲i386構建的,它不是被鏈接的體系結構(armv7) 它試圖鏈接到/ usr/local/lib而不是/ usr/local/ios/lib,雖然AFAIK我有正確設置每個標誌:S – ggambett 2011-04-01 13:39:11

回答

1

我終於想通了。我通過明確地使其與OGG(LDFLAGS="/usr/local/ios/lib/libogg-armv7.a" ./configure ...)鏈接,然後取出從生成的makefile文件明確提到圖書館欺騙configure

+0

三件事:首先,你濫用LDFLAGS追加到你的鏈接行(即指定完整路徑不是LD標誌)。更正確的是LDFLAGS =「 - L/usr/local/ios/lib」。其次,你的解決方案只是一個更具體的(即,只要你嘗試和建立別的東西就會中斷)的情況。即/ usr/local/ios是我提到的目標根。第三,如果信息對你有用,但不是一個足夠的答案,你可以考慮投票答覆我的答案。謝謝。 – kanaka 2011-04-28 15:22:01

+0

@kanaka,感謝您的評論;我剛剛提出了你的答案。至於問題本身,傳遞-L是我嘗試的第一件事情之一,但它沒有任何作用 - 配置一直試圖鏈接到系統範圍的ogg(可能是因爲dylib優先於靜態lib,我不知道)。我知道這是一個黑客攻擊,但是我必須交叉編譯所有的庫,這是唯一有問題的庫,我沒有時間或意圖深入配置內部。 – ggambett 2011-04-28 20:56:08

+0

是的,這是合理的。 autoconf(特別是libtool)在處理庫路徑解析方式上可能相當不透明。如果您希望構建額外的庫和/或應用程序而不是瑣碎的依賴項,則可能需要跟蹤該問題。如果它只是一次性的,那麼做任何工作。 – kanaka 2011-04-29 04:02:09

2

如果您正在交叉編譯比libc(glibc)更多依賴的任何東西,它將變得更加複雜。你需要已經交叉編譯所有的依賴關係。而交叉編譯器工具鏈和所有幫助器構建程序和腳本都需要知道如何找到這些依賴關係(交叉編譯的庫和頭文件)。

您需要已經交叉編譯libogg(及其依賴項)並將它們安裝到交叉編譯根目錄中。主機(arm7)系統不能使用構建系統中的頭文件和庫。他們必須保持分開。另外,如果你想擁有共享對象庫(* .so)而不僅僅是靜態庫,那麼存在一組全新的複雜問題。例如,雖然交叉編譯器工具鏈包含交叉編譯的libc作爲工具鏈的一部分,但您仍然需要主機系統的libc。作爲工具鏈一部分的libc可用於此目的,但其結構的方式與主機系統不同。有時候人們會複製和重新排列這些文件,但通常人們只是編譯並安裝一個新的glibc。

總而言之,你所看到的兩個錯誤是因爲配置腳本無法找到交叉編譯的libogg庫。如果您還沒有,則需要交叉編譯libogg(和依賴項)並將它們安裝到您的目標根目錄中。然後,你需要告訴配置腳本你的交叉編譯頭文件(是的,頭文件是特定於體系結構的)並且庫位於你的目標根目錄中。通常使用CFLAGS,LDFLAGS,CXXFLAGS等(不--PREFIX),但有可能是你還需要設置影響之類的東西pkg配置等,你已經建立了各自的依賴後,其他環境變量,那麼你就需要獲得makefile將依賴項安裝到根目錄。通常這是通過make DESTDIR=[root] install完成的,但是一些makefile有自己的機制(或沒有適當的備用安裝機制)。

您可能還需要重寫某些配置檢查(使用環境變量)寫得不好,並沒有很好的交叉編譯的默認值。這些變量通常ac_cv_開始*

所以基本過程是爲你需要(按照相關性順序)封裝做到這一點:

export CFLAGS=-I[root]/usr/include LDFLAGS=-L[root]/usr/lib CXXFLAGS=-I[root]/usr/include 
export ac_cv_[test1]=[yes|no] ac_cv_[test2]=[yes|no] ... 
./configure --host=[arm7-blah-blah] 
make 
make DESTDIR=[root] install 

好運。一旦你感到舒服標準的交叉編譯,那麼你將準備採取真正的黑色藝術,在Canadian cross ;-)

+0

感謝所有的信息:)事實上,很長一段時間,我曾經使用mingw環境從Linux交叉編譯Windows二進制文件,但我從未遇到過這個問題。 – ggambett 2011-04-27 22:24:57