build、host和target
在交叉編譯中比較常見的一些參數就是build、host和target了,正確的理解這三者的含義對於交叉編譯是非常重要的,下面就此進行解釋
--build=編譯該軟件所使用的平台
--host=該軟件將運行的平台
--target=該軟件所處理的目標平台
我們以 gcc 為例子來 講解 這三者的作用
在gcc編譯中我們使用
./configure --build=編譯平台 --host=運行平台 --target=目標平台 [各種編譯參數]
來配置gcc的源代碼,以讓其編譯出我們需要的gcc編譯器。
那么在這組配置參數中:
--build:
表示目前我們正在運行的平台名稱是什么,如果當前我們是在intel的pentium機器中編譯該系統,那么我們的--build就可能是 i686-pc-linux-gnu,當然如果我們在其它種類的機器上編譯那么這個build就應該是那個機器所對應的平台名稱。
該參數在不指定的情況下將自動嘗試猜測目前平台的名稱。
--host:
表示我們把這個編譯好的gcc在什么樣的平台下運行,在交叉編譯過程中這個需要我們來指定,因為機器自己是不能知道我們心里是怎么想的,那 么我們可以明確的告訴它,我們要做出來的程序是運行在“龍芯”上的,但是目前還不能直接指定“龍芯”,因此我們這里指定為mips64el- unknown-linux-gnu(如果你省點事情那么就用這個名字好了,如果你想用個有個性的名字,那么請你想明白它的含義再動手,並且做好后面的過 程需要多出一些手續的麻煩的心理准備)。
--host也可以不指定,那么host將自動使用build來定義自己,不過那將不再是交叉編譯。
注:--build和--host在不同的時候就被配置文件認定為交叉編譯方式。
--target:
該參數的目的是讓配置程序知道這個軟件被編譯后使用來處理什么平台上的文件的。
target這個參數只有在為數不多的幾個包中有用處,雖然在./configure --help中經常能看到該參數,但實際上絕大多數軟件包都是不需要該參數的。
從這個參數的含義來看,說明其處理的目標只有在不同平台下表現為不同的時候才有作用,而這些文件通常都跟目標平台 的指令系統直接或間接有關:比如可執行文件,對於不同平台下使用的可執行文件的編碼可以是完全不同的,因此必須使用 對應能處理該編碼的程序才能正確處理,而如果錯誤的使用則可能導致程序錯誤或者破壞文件,對於這樣要處理不同平台下會 出現不同編碼的軟件,我們就應當對它指定目標平台,以免另其錯誤處理;而對於文本文件,對於不同的平台同樣的內容表達的 含義都是相同的,因此我們不需要專門針對平台來處理,這樣的軟件我們就可以不必對它指定需要處理的平台了。
我們來總結一下:
build:自動測試在用平台名稱,若無法檢測出來則需要指定。
host:若無指定,自動使用build的結果。
build和host相同時表示本地編譯,若不相同則表示交叉編譯。
target:表示需要處理的目標平台名稱,若無指定使用host相同名稱,gcc、binutils等於平台指令相關軟件有此參數,多數軟件此參數無用處。
綜合的例子:
我們需要在x86下編譯一個運行於arm上的編譯器gcc,這個gcc產生mips平台的目標代碼。那么我們的配置方式是:
--build=x86 --host=arm --target=mips
(僅是示意,方便理解,具體寫法請google)
--build=編譯該軟件所使用的平台
--host=該軟件將運行的平台
--target=該軟件所處理的目標平台
我們以 gcc 為例子來 講解 這三者的作用
在gcc編譯中我們使用
./configure --build=編譯平台 --host=運行平台 --target=目標平台 [各種編譯參數]
來配置gcc的源代碼,以讓其編譯出我們需要的gcc編譯器。
那么在這組配置參數中:
--build:
表示目前我們正在運行的平台名稱是什么,如果當前我們是在intel的pentium機器中編譯該系統,那么我們的--build就可能是 i686-pc-linux-gnu,當然如果我們在其它種類的機器上編譯那么這個build就應該是那個機器所對應的平台名稱。
該參數在不指定的情況下將自動嘗試猜測目前平台的名稱。
--host:
表示我們把這個編譯好的gcc在什么樣的平台下運行,在交叉編譯過程中這個需要我們來指定,因為機器自己是不能知道我們心里是怎么想的,那 么我們可以明確的告訴它,我們要做出來的程序是運行在“龍芯”上的,但是目前還不能直接指定“龍芯”,因此我們這里指定為mips64el- unknown-linux-gnu(如果你省點事情那么就用這個名字好了,如果你想用個有個性的名字,那么請你想明白它的含義再動手,並且做好后面的過 程需要多出一些手續的麻煩的心理准備)。
--host也可以不指定,那么host將自動使用build來定義自己,不過那將不再是交叉編譯。
注:--build和--host在不同的時候就被配置文件認定為交叉編譯方式。
--target:
該參數的目的是讓配置程序知道這個軟件被編譯后使用來處理什么平台上的文件的。
target這個參數只有在為數不多的幾個包中有用處,雖然在./configure --help中經常能看到該參數,但實際上絕大多數軟件包都是不需要該參數的。
從這個參數的含義來看,說明其處理的目標只有在不同平台下表現為不同的時候才有作用,而這些文件通常都跟目標平台 的指令系統直接或間接有關:比如可執行文件,對於不同平台下使用的可執行文件的編碼可以是完全不同的,因此必須使用 對應能處理該編碼的程序才能正確處理,而如果錯誤的使用則可能導致程序錯誤或者破壞文件,對於這樣要處理不同平台下會 出現不同編碼的軟件,我們就應當對它指定目標平台,以免另其錯誤處理;而對於文本文件,對於不同的平台同樣的內容表達的 含義都是相同的,因此我們不需要專門針對平台來處理,這樣的軟件我們就可以不必對它指定需要處理的平台了。
我們來總結一下:
build:自動測試在用平台名稱,若無法檢測出來則需要指定。
host:若無指定,自動使用build的結果。
build和host相同時表示本地編譯,若不相同則表示交叉編譯。
target:表示需要處理的目標平台名稱,若無指定使用host相同名稱,gcc、binutils等於平台指令相關軟件有此參數,多數軟件此參數無用處。
綜合的例子:
我們需要在x86下編譯一個運行於arm上的編譯器gcc,這個gcc產生mips平台的目標代碼。那么我們的配置方式是:
--build=x86 --host=arm --target=mips
(僅是示意,方便理解,具體寫法請google)