本地編譯和交叉編譯(build、host、target)


  通過源碼編譯安裝軟件時,要理解交叉編譯和本地編譯的概念,其中常見的一些參數就是build、host和target了,正確的理解這三者的含義對於交叉編譯是非常重要的:

  --build=編譯該軟件所使用的平台
  --host=該軟件將運行的平台
  --target=該軟件所處理的目標平台

  以 gcc 為例子來講解這三者的作用,在gcc編譯中使用命令 ./configure --build=編譯平台 --host=運行平台 --target=目標平台 [各種編譯參數]   來配置gcc的源代碼,以讓其編譯出需要的gcc編譯器。 那么在這組配置參數中:
  --build:表 示目前正在運行的平台名稱是什么,如果在其它種類的機器上編譯,那么這個build就應該是那個機器所對應的平台名稱。 該參數在不指定的情況下將自動嘗試猜測目前平台的名稱。
  --host: 表示把這個編譯好的gcc放在什么樣的平台下運行,在交叉編譯過程中這個需要我們來指定,如果要做出來的程序是運行在“龍芯”上的,但是目前還不能直接指定“龍芯”,因此這里可以指定為mips64el- unknown-linux-gnu(這樣設置比較省事,避免后期出問題)。 --host也可以不指定,那么host將自動使用build來定義自己,這樣將不再是交叉編譯。注意 :--build和--host在不同的時候就被配置文件認定為交叉編譯方式。
  --target: 該參數的目的是讓配置程序知道這個軟件被編譯后使用來處理什么平台上的文件的。 target這個參數只有在為數不多的幾個包中有用處,雖然在./configure --help中經常能看到該參數,但實際上絕大多數軟件包都是不需要該參數的。 從這個參數的含義來看,說明其處理的目標只有在不同平台下表現為不同的時候才有作用,而這些文件通常都跟目標平台的指令系統直接或間接有關:比如可執行文件,對於不同平台下使用的可執行文件的編碼可以是完全不同的,因此必須使用對應能處理該編碼的程序才能正確處理,而如果錯誤的使用則可能導致程序錯誤或者破壞文件,對於這樣要處理不同平台下會出現不同編碼的軟件,就應當對它指定目標平台,以免另其錯誤處理;而對於文本文件,對於不同的平台同樣的內容表達的含義都是相同的,因此不需要專門針對平台來處理,這樣的軟件就可以不必對它指定需要處理的平台了。
  
  簡單舉例:
  如果需要在x86下編譯一個運行於arm上的編譯器gcc,這個gcc產生mips平台的目標代碼,那么配置方式為:
        --build=x86   --host=arm    --target=mips

  最后簡單總結一下:
  build:自動測試在用平台名稱,若無法檢測出來則需要指定。
  host:若無指定,自動使用build的結果。
  build和host相同時表示本地編譯,若不相同則表示交叉編譯。
  target:表示需要處理的目標平台名稱,若無指定使用host相同名稱,gcc、binutils等於平台指令相關軟件有此參數,多數軟件此參數無用處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM