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

WBOY
發布: 2024-03-06 13:34:02
轉載
354 人瀏覽過

相信很多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
登入後複製

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

如何在ubuntu伺服器交叉編譯不同系統的可執行程式?#查看可執行程式系統架構

然後分別執行這兩個程式:

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

#目前系統的架構:uname -m

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

#一般情況下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中文網其他相關文章!

相關標籤:
來源:mryunwei.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!