相信很多C程式設計師都有過這樣的疑問,如果一台伺服器有不同的gcc版本怎麼辦,它們之間會互相影響嗎?
答案是會的,我們一般使用gcc編譯原始檔時,這個gcc是系統環境變數PATH中最開始找到的gcc。
如果要交叉編譯不同系統的程式呢?這就需要多套的編譯工具鏈了,分別使用對應的工具鏈編譯目標系統的程式。
/usr/bin
目錄下。 /usr/include
中,標準函式庫的頭檔一般都在 /usr/local/include
。 /usr/lib
與 /lib
,靜態函式庫通常也會放在這裡或 /usr/local/lib
。 更改編譯器路徑的環境變數通常不是必要的,因為 /usr/bin
應該已經在你的 PATH
環境變數中了。如果你需要使用不同的編譯器,你可以直接使用其完整路徑或修改 PATH
環境變數來指向你的編譯器,例如:
export PATH=/path/to/your/compiler:$PATH
這樣會在現有的 PATH
前加入你指定的路徑,讓系統先在此處尋找執行檔。
#我需要在Ubuntu上編譯ARM架構的程序,使用Marvell提供的工具鏈。這個工具鏈包含了用於交叉編譯ARM架構程式的gcc和其他工具,它們都具有相同的前綴。
arm编译:这样设置前缀后就可以使用交叉编译器 export CROSS_COMPILE=/home/zheng/marvell-tools-12006.0/bin/aarch64-marvell-linux-gnu- 使用环境变量进行编译: ${CROSS_COMPILE}gcc-o hello_arm hello_arm.c
#查看可執行程式系統架構
然後分別執行這兩個程式:
#目前系統的架構:uname -m
#一般情況下gcc是會依照系統預設的PATH路徑去尋找編譯時所需要的對應的工具元件
。
所以如果要編譯不同架構的程序,就需要有多套的工具鏈,如果都把這些工具鏈的路徑加到系統的環境變數PATH中則會產生衝突
,會優先使用前面路徑中的同名工具,例如PATH設定為:
export PATH=/path/arm_toolchain/bin:/usr/bin:/path/x86_toolchain/bin
/path/arm_toolchain/bin和/usr/bin,/path/x86_toolchain/bin都有名稱為gcc的工具,那麼前面的就會覆蓋後面的
,每次執行都會優先使用最早被配對到的gcc工具
。
缺點:無法動態指定不同架構的編譯工具鏈,需要頻繁修改PATH環境變數。
改進方法:為每個工具鏈指定對應的環境變數
,這樣就可以動態區分不同的編譯器。
這種辦法適合臨時切換工具鏈,編譯不同架構的程序,如果是大型C程序一般是透過設定檔中指定了編譯器的路徑,然後使用make,或meson等建置工具進行建置。
以上是如何在ubuntu伺服器交叉編譯不同系統的可執行程式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!