2012-08-03 112 views
7

我需要交叉編譯一些C/C++庫。該庫依賴於幾個C/C++庫。其中一些圖書館依次依賴於其他圖書館。所有庫都帶有配置腳本。我知道如何在主機系統上編譯和安裝庫 - 在需要的庫之前安裝依賴關係。顯然這在交叉編譯時不起作用。任何提示都表示讚賞。謝謝。如何交叉編譯具有依賴關係的C++庫?

回答

8

通常,要交叉編譯自動處理的程序包,您需要向./configure傳遞幾個額外的參數:--host--build--host是構建程序將運行的系統的名稱,--build是執行編譯的系統的名稱。

當我說「系統的名稱」時,我的意思是一個形式爲ARCH-VENDOR-OS-LIBC的元組。 (例如,i686-pc-linux-gnu是描述我目前使用的系統的元組。)有時,部分元組被省略,例如mingw32工具鏈(在我的系統中,mingw32十字工具與元組i586-mingw32msvc和/或amd64-mingw32msvc)。

(有另一個參數來配置,--target,這對交叉編譯的編譯器,並指定編譯器正在構建生成代碼時將針對該系統。)

每個工具鏈具有下作爲這樣/usr自己的子目錄/usr/i586-mingw32msvc。你將要在這裏安裝新的軟件包,以便找到它們。使用--prefix參數到configure

從我的GNU/Linux系統的MINGW32體系,使交叉編譯,我會跑configure這樣的:

./configure --host=i586-mingw32msvc --build=i686-pc-linux-gnu --prefix=/usr/i586-mingw32msvc 

因此,開始你的依賴關係圖的葉子和您的方式工作。您可能還想通過--enable-static --disable-sharedconfigure:這將停止爲librapled軟件包創建動態庫。如果程序包需要運行程序作爲構建的一部分,則可能必須原生安裝一些程序包並交叉編譯它們。

有時configure的測試將失敗:例如,它試圖編譯和運行一個程序。通常這些測試會設置一個緩存變量,您也可以通過命令行將其傳遞到configure。同樣,您可以覆蓋程序路徑和庫編譯/鏈接標誌等內容。檢查你的包裹的./configure --help

0

您需要做的是爲所有依賴項創建靜態庫並將它們靜態鏈接到您的可執行文件。您需要使用交叉編譯器來生成這些庫。通過查找「min​​gw靜態鏈接交叉編譯」可以找到一些很好的示例

3

只要確保針對目標系統的頭文件和庫構建交叉編譯共享庫,完全沒有問題而不是開發主機。

即使您將所有顯而易見的依賴項都構建爲靜態庫,您仍可能會發現自己正在鏈接到共享的C和C++語言運行時庫。您還需要確保用於交叉編譯的頭文件是來自目標系統而非開發主機的頭文件。
不這樣做可能會在大多數時間工作。剩下的時間你會得到微妙的難以調試的崩潰。

您如何實現這一點取決於您的交叉工具鏈和目標環境。正如你所提到的,我會猜測它是GCC和一些Linux的開發主機和目標 - 雖然這些原則同樣適用於使用其他開發主機。

交叉編譯通常會構建GCC和bin-utils分發,以便默認的庫和頭搜索路徑指向目標系統的根文件系統的副本。這是鏈接器將查找共享庫進行鏈接的位置,並且在這裏您可以在構建它們時安裝依賴共享庫。

您可以通過在命令行上將--sysroot <mySysRoot>選項傳遞給GCC來覆蓋GCC的默認系統根目錄。