用VirtualBox建立Ubuntu虛擬機|設定C語言編譯環境|交叉編譯教學

2024/02/22閱讀時間約 9 分鐘

想要進入工程師的世界,首先要先學會架設自己的Build code環境,有了編譯環境,接下來就可以安心的撰寫你想要的C語言程式啦!

如果你不知道該從何下手,那不妨先照著本篇文章的步驟做,Violet一步一步教你並解釋每個步驟的意義,很快你就會得到一個能編譯C語言程式碼的虛擬基環境哦!



創建虛擬機(Virtual Machine, VM)

首先要設定虛擬機的規格,比如記憶體空間及作業系統型態等。

  1. 下載及安裝VirtualBox
  2. 開啟VirtualBox後,點選New來創建自己的虛擬機
  3. 選擇文件系統(Type)及版本(Version)。因為要安裝的Ubuntu是linux作業系統眾多版本中的其中一種,因此type要選擇linux;版本則是選Ubuntu(64-bit)。
選擇文件系統及版本

選擇文件系統及版本

  1. 設定電腦執行此虛擬機時,所需的記憶體大小(RAM),設定完成後點選下一步。建議最少需要2GB(2048MB)
設定記憶體大小

設定記憶體大小

  1. 指定虛擬機的虛擬硬碟來源,可以選擇創建新的虛擬硬碟或是匯入已存在的虛擬硬碟檔。本篇文章要介紹的是,如何創建全新的虛擬機,因此選擇創建新的虛擬硬碟。
設定硬碟來源

設定硬碟來源

  1. 指定虛擬硬碟的型態,通常選擇VDI即可。
硬碟映像檔

硬碟映像檔

  1. 設定虛擬硬碟大小,這個大小代表你能在虛擬機裡面存放多少檔案,Build code通常需要較多的空間,因此至少給80G比較好。


在虛擬機上安裝Ubuntu作業系統

有了虛擬機之後,可以開始安裝Ubuntu作業系統了。這過程就如同你在電腦上灌Windows作業系統一樣。

  1. 下載你所需的Ubuntu版本映像檔,以ubuntu-14.04.6為例,可點選此連結進到網站裡挑選,或點選ubuntu-14.04.6-desktop-amd64.iso直接下載。
  2. 選擇Storage來掛載下載好的.iso檔。
掛載指定的Ubuntu映像檔

掛載指定的Ubuntu映像檔

  1. 虛擬機開機。
虛擬機開機

虛擬機開機

  1. 選擇要安裝的Ubuntu映像檔。
選擇開機硬碟

選擇開機硬碟

  1. 開始安裝Ubuntu-14.04.6。
安裝Ubuntu

安裝Ubuntu

  1. 安裝前的準備,勾選後按下一步即可。
準備安裝Ubuntu

準備安裝Ubuntu

  1. 選擇清除硬碟後安裝Ubuntu。
選擇安裝方式

選擇安裝方式

  1. 有一些類似補丁包的東西需要寫入,案繼續即可。
寫入補丁

寫入補丁

  1. 選擇所在地區。
選擇地區

選擇地區

  1. 設定語言。
選擇語言

選擇語言

  1. 設定虛擬機名稱及設定帳戶。
設定虛擬機登入帳戶

設定虛擬機登入帳戶

  1. 設定完成後,接著等待安裝完畢。
等待安裝完成

等待安裝完成


設定Build code環境編譯C語言

安裝好Ubuntu後,終於進入Ubuntu系統啦!現在可以開始在Ubuntu中架設Build code環境,為了之後編譯C語言程式碼做準備。

  1. 在Ubuntu中開啟Terminal,如同Windows中的命令提示字元(cmd)。
開啟terminal

開啟terminal

  1. 全新的Ubuntu環境中,需要先安裝一些基本常用的安裝包,這取決於你之後需要用到什麼。我們要先架設簡單的編譯.c檔環境,需要用到vi指令來開啟檔案、編輯檔案等,因此先安裝vi安裝包。
sudo apt-get update
sudo apt-get install vim
安裝vi指令

安裝vi指令

  1. 接著先創建一個Build code的根目錄,我的根目錄叫做yolanda。並在此目錄下創建一個hello.c的檔案。
mkdir yolanda
cd yolanda
touch hello.c
  1. 編輯hello.c檔,在檔案中寫一個能印​出Hello World的簡易function。
vi hello.c

5. hello.c檔的內容。

#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
創建.c檔

創建.c檔

  1. 創建編譯檔案Makefile。
touch Makefile
  1. 編輯Makefile檔,在檔案中寫一個能編譯hello.c檔的工作目標。
vi Makefile
  1. Makefile內容,第一行的"hello:"寫法代表這是一個名叫hello的工作目標,第二行代表hello工作目標要執行的指令。
    注意,工作目標內所要執行的指令,開頭需要使用Tab鍵而非空格鍵,因此第二行的開頭要是Tab,此Makefile才能正確工作。
hello:
gcc hello.c -o hello
創建Makefile

創建Makefile

  1. 創建檔案完成後,在根目錄下執行ls指令來確認檔案。
檢查檔案

檢查檔案

  1. 使用make hello指令來執行剛剛寫好的hello工作目標,接著執行ls,會發現根目錄下多了綠色的hello檔案,此檔案就是hello.c檔被編譯出來的執行檔了,只要執行這個綠色的執行檔,就能成功印出Hello World的字,而這正是我們在hello.c檔裡面所寫的函式。
    到這裡,編譯C語言程式碼的環境就真正設定完成囉!
make hello
ls
./hello
編譯.c檔

編譯.c檔


在本機及虛擬機之間傳輸檔案

開發過程中,常常會需要在本機與虛擬機之間傳輸檔案,這時候我們可以透過最簡單的方法,就是使用WinSCP當作橋梁,來完成本機與虛擬機之間的連線。接下來將會介紹如何設定WinSCP來傳輸檔案,當然還有很多方法可以傳輸檔案,有興趣可以自行研究。

Ubuntu端設定

  1. Ubuntu傳輸檔案,最常用到的就是ssh的服務,因此我們先將Ubuntu這端的ssh設定好。
sudo apt-get install openssh-server  # 安裝ssh來實現遠端連線
vi /etc/ssh/sshd_config # 視情況修改ssh的設定檔
/etc/init.d/ssh restart # 修改完設定檔後,需要重新啟動ssh
sudo service ssh start # 若ssh程序不存在,下指令將其開啟
ps -e | grep ssh # 檢查ssh是否被開啟成功
檢查ssh服務

檢查ssh服務

  1. 在本機端檢查虛擬機網卡的IP為192.168.56.1,並將其記下,等等會用到。
    從本機連線到虛擬機,所使用的IP就是這個。
檢查實體電腦的網卡狀態

檢查實體電腦的網卡狀態

  1. 在Ubuntu下檢查網卡IP為10.0.2.15,並將其記下,等等會用到。
    此為虛擬機的IP。
Ubuntu網卡IP

Ubuntu網卡IP

  1. 回到VirtualBox,點選虛擬機的網路設定,將網卡設定為NAT模式,並新增一個網卡轉發的規則。
    虛擬機IP為私有IP,無法直接連接網際網路,因此需要使用網路位址轉換(Network Address Translator,NAT)來實現連線。
設定虛擬機網路

設定虛擬機網路

  1. 轉發的規則設定為,Host IP輸入剛才記下來的,在本機上看到的虛擬機網卡IP(192.168.56.1);Guest IP則輸入在ubuntu下看到的網卡IP(10.0.2.15)。
    意即,將虛擬機的私有IP轉換為其他人能認得的公共IP,這樣就可以透過192.168.56.1來連線到虛擬機了。
設定虛擬機網路

設定虛擬機網路

本機端設定

  1. 下載及安裝WinSCP軟體。
  2. 執行WinSCP,並登入要連線的虛擬機,輸入虛擬機的IP及帳號密碼。
WinSCP輸入Ubuntu資訊

WinSCP輸入Ubuntu資訊

  1. 能成功連線的話,就會出現以下畫面,選Yes即可。
WinSCP連線到Ubuntu

WinSCP連線到Ubuntu

  1. 連線成功的畫面,左邊是本機,右邊是虛擬機,可以看到剛才創建的hello.c及Makefile檔。
WinSCP建立連線成功

WinSCP建立連線成功


使用交叉編譯(cross-compiling)

開發過程中,可能會需要在不同的平台上來執行檔案,而不同的平台可能會用不同的CPU架構等等,這時候如果將在x86平台編譯出來的執行檔放到ARM架構上面執行,是會無法執行的,因此我們需要使用交叉編譯來解決跨平台的問題。

想要交叉編譯,首先要有該平台相對應的toolchain。我們以ARM平台的toolchain為例,如果你已經有toolchain了,可以照著下面的步驟繼續做。

  1. 確認你的toolchain路徑,我的toolchain路徑為toolchains/iproc。
下載toolchain

下載toolchain

  1. 創建一個檔案來讓環境變數在當前的terminal中生效。
touch env.sh
  1. env.sh內容
#!/usr/bin/env bash

export CROSS_COMPILE_PATH=toolchains/iproc​
export PSTH=$PATH:${CROSS_COMPILE_PATH}/bin
export CROSS_COMPILE=${CROSS_COMPILE_PATH}/bin/arm/linux-gcc
環境變數設定

環境變數設定

  1. 使環境變數生效
source liteon_env.sh
  1. 輸入arm-linux,並且連按2次Tab鍵,若看到以下畫面,表示toolchain有被安裝成功。
arm-linux
環境變數生效

環境變數生效

  1. 修改前面創建過的Makefile來執行交叉編譯。
hello:
${CROSS_COMPILE} ${PWD}/hello.c -o hello​
修改Makefile來執行交叉編譯

修改Makefile來執行交叉編譯

  1. 執行make hello來編譯能跨平台的使用的hello執行檔,編譯出來之後,可以利用file指令來檢查檔案格式,確定編譯出來的執行檔是ARM平台可使用的檔案。
make hello
ls
file hello
交叉編譯hello.c

交叉編譯hello.c


做到這邊,恭喜你已經擁有了自己的編譯環境,也學會了基本的Makefile編譯。

不過Makefile寫法博大精深,有太多太多東西可以介紹了,這邊就不多做說明了。




感謝您耐心閱讀~
本專題將會持續收錄Violet的職場筆記。
若有理解不對的地方,歡迎留言指教!
若喜歡我的文章,歡迎贊助支持,您的支持將會成為我繼續創作的動力!

7會員
50內容數
記錄每一次珍貴的旅行,讓回憶變成永恆 這裡沒有華麗的詞藻,卻有最真實的筆記 札記撰寫耗時,願我有動力一直寫下去!
留言0
查看全部
發表第一個留言支持創作者!