跳至內容

如何在ubuntu服務器交叉編譯不同系統的可執行程序?

更新時間
快连VPN:速度和安全性最佳的VPN服务
快连VPN:速度和安全性最佳的VPN服务

相信很多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服務器交叉編譯不同系統的可執行程序?的詳細內容,更多請關注本站其它相關文章!

更新時間

發表留言

請注意,留言須先通過審核才能發佈。