Linux Mac 交叉編譯 Android 程式

2021-08-03 05:36:05 字數 1959 閱讀 7152

簡單地說,就是程式的編譯的環境和它的執行的環境不一樣。即在乙個平台上生成另乙個平台上的可執行**。交叉編譯的概念主要和嵌入式開發有關。

主要是由於目標環境中各種資源都相對有限,所以很難直接進行本地編譯。

交叉工具鏈是指可以生成目標環境可執行**的工具集。我們知道,在linux系統中的編譯工具鏈包括以下一些工具, 編譯器gcc, 鏈結器ld, 歸檔工具ar等等,如果在 linux 環境中交叉編譯 android 系統環境可執行的**,是不能直接使用linux下的編譯工具的,而應該使用 android ndk 裡的工具鏈,它們對應的名子為 arm-linux-android-gcc, arm-linux-android-ld等等。

arch-[vendor]-kernel-system-toolname。它由五部分組成,下面分別解釋一下每部分的含義:

arch,指的是cpu架構, 一般包括如下幾種架構: arm, mips, powerpc, x86, x86_64。

verdor, 一般指的是生產廠商, 如果沒有生產廠商可以為空。

kernel, 指的目標環境使用的 kernel,以android為例,它使用的是 linux核心,所以在這部分會填寫為linux。

system, 指的是那個系統, 如androideabi, android

toolname: 指的是 gcc, ld, ar等。

所以我們可以看到 android 的編譯工具的名子會寫成 arm-linux-andirod-gcc。

在做交叉編譯時,我們常會在指令碼中定義一些環境變數以方便我們命名用,常用的環境變數如下:

prefix: 指明交叉編譯後輸出的目錄。

arch: 指明交叉編譯後輸出的cpu架構。

cross-prefix:指明交叉編譯前輟 arch-vender-kernel-system

sysroot: 指明交叉編譯目標機器的標頭檔案和庫檔案目錄

toolchain: 指明交叉編譯工具鏈的位置。

platfrom: 指明交叉編譯時使用的是哪個版本的的標頭檔案和庫檔案。它是 sysroot的一部分。

android_ndk: 指明 android ndk 所在目錄。

通過設定configure 引數來生成交叉編譯的 makefile 檔案

—arch 指定架構

—cross-prefix 交叉編譯工具鏈前輟

—sys root 交叉編譯樹的根例了

以ffmpeg的交叉編譯為例,我們可以來看一下如果生成交叉編譯的makefile。

./configure –target-os=linux –arch=arm –enable-cross-compile –cross-prefix=arm-linux-androideabi- –sysroot=~library/android/sdk/ndk-bundle/platforms/android-9/arch-arm

執行後的結果如下:

install prefix            /usr/local

source path .

c compiler arm-linux-androideabi-gcc

c library bionic

host c compiler gcc

host c library

arch arm (armv5te)

編譯 交叉編譯

交叉編譯含義 是指在乙個平台上生成另乙個平台上的可執行 同乙個體系結構可以執行不同的作業系統,同樣乙個作業系統也可以在不同的體系結構上執行 例 常說的x86 linux平台 指inter x86體系結構及linux for x86作業系統 x86 winnt平台 指inter x86體系結構及win...

交叉編譯(2) 交叉編譯鏈

什麼是交叉編譯鏈 明白了什麼是交叉編譯,那我們來看看什麼是交叉編譯鏈。首先編譯過程是按照不同的子功能,依照先後順序組成的乙個複雜的流程,如下圖 那麼編譯過程包括了預處理 編譯 彙編 鏈結等功能。既然有不同的子功能,那每個子功能都是乙個單獨的工具來實現,它們合在一起形成了乙個完整的工具集。同時編譯過程...

交叉編譯 Go 交叉編譯 跨平台編譯

golang 支援交叉編譯,在乙個平台上生成另乙個平台的可執行程式 cgo enabled 0 goos linux goarch amd64 go build main.go cgo enabled 0 goos windows goarch amd64 go build main.go cgo ...