想要進入工程師的世界,首先要先學會架設自己的Build code環境,有了編譯環境,接下來就可以安心的撰寫你想要的C語言程式啦!
如果你不知道該從何下手,那不妨先照著本篇文章的步驟做,Violet一步一步教你並解釋每個步驟的意義,很快你就會得到一個能編譯C語言程式碼的虛擬基環境哦!
創建虛擬機(Virtual Machine, VM)
首先要設定虛擬機的規格,比如記憶體空間及作業系統型態等。
- 下載及安裝VirtualBox
- 開啟VirtualBox後,點選New來創建自己的虛擬機
- 選擇文件系統(Type)及版本(Version)。因為要安裝的Ubuntu是linux作業系統眾多版本中的其中一種,因此type要選擇linux;版本則是選Ubuntu(64-bit)。
- 設定電腦執行此虛擬機時,所需的記憶體大小(RAM),設定完成後點選下一步。建議最少需要2GB(2048MB)
- 指定虛擬機的虛擬硬碟來源,可以選擇創建新的虛擬硬碟或是匯入已存在的虛擬硬碟檔。本篇文章要介紹的是,如何創建全新的虛擬機,因此選擇創建新的虛擬硬碟。
- 指定虛擬硬碟的型態,通常選擇VDI即可。
- 設定虛擬硬碟大小,這個大小代表你能在虛擬機裡面存放多少檔案,Build code通常需要較多的空間,因此至少給80G比較好。
在虛擬機上安裝Ubuntu作業系統
有了虛擬機之後,可以開始安裝Ubuntu作業系統了。這過程就如同你在電腦上灌Windows作業系統一樣。
- 下載你所需的Ubuntu版本映像檔,以ubuntu-14.04.6為例,可點選此連結進到網站裡挑選,或點選ubuntu-14.04.6-desktop-amd64.iso直接下載。
- 選擇Storage來掛載下載好的.iso檔。
- 虛擬機開機。
- 選擇要安裝的Ubuntu映像檔。
- 開始安裝Ubuntu-14.04.6。
- 安裝前的準備,勾選後按下一步即可。
- 選擇清除硬碟後安裝Ubuntu。
- 有一些類似補丁包的東西需要寫入,案繼續即可。
- 選擇所在地區。
- 設定語言。
- 設定虛擬機名稱及設定帳戶。
- 設定完成後,接著等待安裝完畢。
設定Ubuntu與Windows之間的文字複製貼上
安裝好以下套件後,需要重新啟動虛擬機,就能複製windows的文字貼上了。
sudo apt-get install open-vm-tools-desktop
生成git server公用金鑰
要能順利到指定的Git server上下載源碼(source code),需要在虛擬機上生成私鑰及公鑰,並將公鑰填到Git server上。
ssh-keygen
生成好後,找到id_rsa.pub檔案並開啟,將其內容複製貼上到Git server上,即可下載該Git server的source code到你的虛擬機上了。
路徑:~/.ssh/id_rsa.pub
設定Build code環境編譯C語言
安裝好Ubuntu後,終於進入Ubuntu系統啦!現在可以開始在Ubuntu中架設Build code環境,為了之後編譯C語言程式碼做準備。
- 在Ubuntu中開啟Terminal,如同Windows中的命令提示字元(cmd)。
- 全新的Ubuntu環境中,需要先安裝一些基本常用的安裝包,這取決於你之後需要用到什麼。我們要先架設簡單的編譯.c檔環境,需要用到vi指令來開啟檔案、編輯檔案等,因此先安裝vi安裝包。
sudo apt-get update
sudo apt-get install vim
- 接著先創建一個Build code的根目錄,我的根目錄叫做yolanda。並在此目錄下創建一個hello.c的檔案。
mkdir yolanda
cd yolanda
touch hello.c
- 編輯hello.c檔,在檔案中寫一個能印出Hello World的簡易function。
vi hello.c
5. hello.c檔的內容。
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
- 創建編譯檔案Makefile。
touch Makefile
- 編輯Makefile檔,在檔案中寫一個能編譯hello.c檔的工作目標。
vi Makefile
- Makefile內容,第一行的"hello:"寫法代表這是一個名叫hello的工作目標,第二行代表hello工作目標要執行的指令。
注意,工作目標內所要執行的指令,開頭需要使用Tab鍵而非空格鍵,因此第二行的開頭要是Tab,此Makefile才能正確工作。
hello:
gcc hello.c -o hello
- 創建檔案完成後,在根目錄下執行ls指令來確認檔案。
- 使用make hello指令來執行剛剛寫好的hello工作目標,接著執行ls,會發現根目錄下多了綠色的hello檔案,此檔案就是hello.c檔被編譯出來的執行檔了,只要執行這個綠色的執行檔,就能成功印出Hello World的字,而這正是我們在hello.c檔裡面所寫的函式。
到這裡,編譯C語言程式碼的環境就真正設定完成囉!
make hello
ls
./hello
在本機及虛擬機之間傳輸檔案
開發過程中,常常會需要在本機與虛擬機之間傳輸檔案,這時候我們可以透過最簡單的方法,就是使用WinSCP當作橋梁,來完成本機與虛擬機之間的連線。接下來將會介紹如何設定WinSCP來傳輸檔案,當然還有很多方法可以傳輸檔案,有興趣可以自行研究。
Ubuntu端設定
- 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是否被開啟成功
- 在本機端檢查虛擬機網卡的IP為192.168.56.1,並將其記下,等等會用到。
從本機連線到虛擬機,所使用的IP就是這個。
- 在Ubuntu下檢查網卡IP為10.0.2.15,並將其記下,等等會用到。
此為虛擬機的IP。
- 回到VirtualBox,點選虛擬機的網路設定,將網卡設定為NAT模式,並新增一個網卡轉發的規則。
虛擬機IP為私有IP,無法直接連接網際網路,因此需要使用網路位址轉換(Network Address Translator,NAT)來實現連線。
- 轉發的規則設定為,Host IP輸入剛才記下來的,在本機上看到的虛擬機網卡IP(192.168.56.1);Guest IP則輸入在ubuntu下看到的網卡IP(10.0.2.15)。
意即,將虛擬機的私有IP轉換為其他人能認得的公共IP,這樣就可以透過192.168.56.1來連線到虛擬機了。
本機端設定
- 下載及安裝WinSCP軟體。
- 執行WinSCP,並登入要連線的虛擬機,輸入虛擬機的IP及帳號密碼。
- 能成功連線的話,就會出現以下畫面,選Yes即可。
- 連線成功的畫面,左邊是本機,右邊是虛擬機,可以看到剛才創建的hello.c及Makefile檔。
使用交叉編譯(cross-compiling)
開發過程中,可能會需要在不同的平台上來執行檔案,而不同的平台可能會用不同的CPU架構等等,這時候如果將在x86平台編譯出來的執行檔放到ARM架構上面執行,是會無法執行的,因此我們需要使用交叉編譯來解決跨平台的問題。
想要交叉編譯,首先要有該平台相對應的toolchain。我們以ARM平台的toolchain為例,如果你已經有toolchain了,可以照著下面的步驟繼續做。
- 確認你的toolchain路徑,我的toolchain路徑為toolchains/iproc。
- 創建一個檔案來讓環境變數在當前的terminal中生效。
touch env.sh
- 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
- 使環境變數生效
source liteon_env.sh
- 輸入arm-linux,並且連按2次Tab鍵,若看到以下畫面,表示toolchain有被安裝成功。
arm-linux
- 修改前面創建過的Makefile來執行交叉編譯。
hello:
${CROSS_COMPILE} ${PWD}/hello.c -o hello
- 執行make hello來編譯能跨平台的使用的hello執行檔,編譯出來之後,可以利用file指令來檢查檔案格式,確定編譯出來的執行檔是ARM平台可使用的檔案。
make hello
ls
file hello
做到這邊,恭喜你已經擁有了自己的編譯環境,也學會了基本的Makefile編譯。
不過Makefile寫法博大精深,有太多太多東西可以介紹了,這邊就不多做說明了。
感謝您耐心閱讀~
本專題將會持續收錄Violet的職場筆記。
若有理解不對的地方,歡迎留言指教!
若喜歡我的文章,歡迎贊助支持,您的支持將會成為我繼續創作的動力!