本章內(nèi)容對應視頻講解鏈接(在線觀看):
![]() 我們寫了 linux 上第一個 c 程序 heollo world ,是使用 gcc 編譯器進行代碼的編譯,編譯得到的可執(zhí)行文件只能在 X86 結(jié)構的 PC 上運行,我們來看下,在我的 ubuntu 的 test 目錄下有一個 hello.c ,這個程序也非常簡單,就是一個 hello world ,我們來編譯一下,然后運行下可執(zhí)行文件,這個可執(zhí)行文件是可以在 PC上運行的。如下圖所示。 ![]() 然后我們使用 file 命令來看下這個文件,這個文件是可以在 X86 上運行的,但是它不能在 ARM 上運行,因為它這里寫的是 X86。如下圖所示。 ![]() 如果我們想在 ARM 上運行,就要使用 ARM 的編譯器,然后在 X86 上進行編譯。因為我們使用 ARM 的編譯器編譯完了之后,是把我們的可執(zhí)行程序放到開發(fā)板上來運行,而不是在 PC 上運行的,這個過程大家可以把它理解成交叉,然后再和我們的編譯器結(jié)合起來就叫做交叉編譯器。交叉編譯器的種類有很多,我 們使用 的 是 Linaro 公 司 的 arm 交 叉 編 譯 器 , 這 是 交 叉 編 譯 器 的 地 址 ![]() 我們已經(jīng)給大家下載好了,打開 i.MX6ULL 終結(jié)者光盤資料\01_開發(fā)及燒寫工具\1.交叉編譯器,給大家下載好了一個是 64 位的,一個是 32 位的,如下圖所示。 ![]() 然后我們把交叉編譯器拷貝到 ubuntu,因為我們安裝的是 64 位的 ubuntu ,所以要安裝 64 位的交叉編譯器,這里作者不推薦大家安裝 32 位的 ubuntu,因為 64 位的 ubuntu,可以安裝支持 32 位的依賴包,但是 32 位的 ubuntu 安裝不了 64 位的依賴包,所以大家哪怕這里是安裝的 64 位的,但是他也是向下兼容32 位的,所以作者這里推薦提供的都是 ubuntu64 位的系統(tǒng), 接下來我們安裝下交叉編譯器,我們使用 ssh 把我們交叉編譯器的安裝包拷貝到 ubuntu 上,進入 /usr/local cd /usr/local 進到這個目錄,然后我們在這個目錄下創(chuàng)建一個名為 arm 的文件夾, sudo mkdir arm 然后我們進到 arm 文件夾里面,我們把我們的交叉編譯器放到這個目錄上, cd arm 我們打開 ssh 軟件,連接下 ubuntu ,這里大家也可以使用 samba 這個工具來安裝,都是可以的,然后我們通過 ssh 軟件進到我們剛剛創(chuàng)建的目錄 /usr/local/arm 這個目錄,然后我們把光盤里面的交叉編譯器拖過來,我們這里要用 64 位的,然后我們在 ubuntu 上解壓這個文件,解壓直接使用 tar 命令就可以了,如下圖所示。 sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz ![]() 我們要使用管理員的身份來運行,解壓成功后,就會在當前目錄下看到生成的這個文件,如下圖所示。 ![]() 解壓完之后下一步就要添加環(huán)境變量了,這里之前給大家講過了,ubuntu 修改的是這個文件,我們也可以修改 .bashrc 文件,我們之前講到了修改環(huán)境變量的方法,參考第十七章,我們修改的這個文件是對所有用戶生效的,就是說我在這里添加完了環(huán)境變量,不管是在 topeet 用戶還是在 root 用戶都可以找到arm 交叉編譯器,如果是在 bashrc 這個文件下修改,那么你當前是哪個用戶你就僅對當前這個用戶生效,所以我們來改下這個文件,打開文件如圖所示。 ![]() 然后我們進到這個文件的最后,輸入 export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin ![]() 修改完了之后,我們要重啟下 ubuntu,這樣交叉編譯環(huán)境才能生效,環(huán)境變量才可以生效。使用命令 sudo reboot ![]() 重啟成功后,我們來檢查我們的交叉編譯器有沒有成功安裝,我們可以在控制臺上輸入 arm- 輸入一個Tap 他會自動幫我們補全,然后我們輸入一個 gcc -v , arm-linux-gnueabihf-gcc -v 如果這里顯示了 gcc 的版本號 4.9.4 說明我們的交叉編譯器是成功的,如下圖所示。如果這里大家跟我顯示的不太一樣,大家可以看下環(huán)境變量有沒有設置對,還有大家安裝的 ubuntu 是不是 64 位的,因為我這里安裝的是 64 位的交叉編譯器。 ![]() 然后我們進到 test 目錄下,我們使用交叉編譯器來編譯下 hello.c ,編譯方法和我們之前使用 gcc 編譯方法是一樣的,gcc 加 hello.c 這個源文件,然后后邊跟上-o 指定的文件名稱,格式是一摸一樣的,只不過把 gcc 編譯器換成了交叉編譯器,使用 arm-linux-gnueabihf- 后邊跟上 gcc 和我們要編譯的原文件的名字,-o 指定下我們要生成的可執(zhí)行文件,這樣我們就編譯成功了,如下圖所示。 ![]() 然后我們可以來運行下這個 hello ,大家看他這里是提示錯誤的,我們不能執(zhí)行,如下圖所示。 ![]() 使用 file 命令來看下,這里顯示的架構是 arm ,說明我們這個可執(zhí)行文件是在開發(fā)板上運行的而不是在 X86 上運行的,可以看到,使用 gcc 編譯器編譯出來的可執(zhí)行文件,它的架構是 X86 的,所以我們使用 gcc編譯器編譯完的可執(zhí)行程序只能在 X86 的 ubuntu 上運行,不能在 arm 上運行。大家通過 file 命令就可以區(qū)分了,大家可以自己安裝下。如下圖所示。 ![]() |