開始著手 linux shell/ makefile 編程,菜鳥(我自己)對這些底層技術不是很了解,one by one 吧!共勉!
1. build、 host 和 target 初步
在交叉編譯中比較常見的一些參數就是build、host 和 target了,正確的理解這三者的含義對於交叉編譯是非常重要的,下面就此進行解釋
--build=編譯該軟件所使用的平台
--host=該軟件將運行的平台
--target=該軟件所處理的目標平台
2. 以 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中經常能看到該參數,但實際上絕大多數軟件包都是不需要該參數的。
從這個參數的含義來看,說明其處理的目標只有在不同平台下表現為不同的時候才有作用,而這些文件通常都跟目標平台 的指令系統直接或間接有關:
比如可執行文件,對於不同平台下使用的可執行文件的編碼可以是完全不同的,因此必須使用 對應能處理該編碼的程序才能正確處理,
而如果錯誤的使用則可能導致程序錯誤或者破壞文件,對於這樣要處理不同平台下會 出現不同編碼的軟件,我們就應當對它指定目標平台,以免另其錯誤處理;
而對於文本文件,對於不同的平台同樣的內容表達的 含義都是相同的,因此我們不需要專門針對平台來處理,這樣的軟件我們就可以不必對它指定需要處理的平台了。
3. 總結一下
build:自動測試在用平台名稱,若無法檢測出來則需要指定。
host:若無指定,自動使用 build 的結果。
build 和 host 相同時表示本地編譯,若不相同則表示交叉編譯。
target:表示需要處理的目標平台名稱,若無指定使用 host 相同名稱,gcc、binutils 等於平台指令相關軟件有此參數,多 數軟件此參數無用處。
下面舉幾個例子,雖然是英文,但是很好理解。
1. `./configure --build=mipsel-linux --host=mipsel-linux
--target=mipsel-linux' will build native mipsel-linux binutils on
mipsel-linux.
2. `./configure --build=i386-linux --host=mipsel-linux
--target=mipsel-linux' will cross-build native mipsel-linux binutils on
i386-linux.
3. `./configure --build=i386-linux --host=i386-linux
--target=mipsel-linux' will build mipsel-linux cross-binutils on
i386-linux.
4. `./configure --build=mipsel-linux --host=i386-linux
--target=mipsel-linux' will cross-build mipsel-linux cross-binutils for
i386-linux on mipsel-linux.