用VirtualBox建立Ubuntu虛擬機|Ubuntu複製貼上文字|設定C語言編譯環境|交叉編譯教學

閱讀時間約 10 分鐘

想要進入工程師的世界,首先要先學會架設自己的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. 設定完成後,接著等待安裝完畢。
等待安裝完成

等待安裝完成


設定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語言程式碼做準備。

  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的職場筆記。
若有理解不對的地方,歡迎留言指教!
若喜歡我的文章,歡迎贊助支持,您的支持將會成為我繼續創作的動力!

avatar-img
37會員
69內容數
記錄每一次珍貴的旅行,讓回憶變成永恆 這裡沒有華麗的詞藻,卻有最真實的筆記 札記撰寫耗時,願我有動力一直寫下去! ※本沙龍每次只會挑其中一個專題來發佈文章,每隔三週的週五為發佈日,若未發佈文章,下一個發佈日就是三週後,希望大家可以多多支持,也歡迎留言指教,您的留言或愛心都是Violet持續創作的寶貴動力唷~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Violet旅遊札記 的其他內容
當大量的網路封包在有限的頻寬中傳輸,總有一些服務的封包會因為搶不過其他封包而造成卡頓,例如玩遊戲時,若同時也在下載其他大型檔案,就會造成遊戲卡頓甚至斷線。這時候客製化QOS來決定哪些封包能優先被傳送,就能有效地提升指定服務的順暢度,進而提升使用者在網路上的體驗。 本篇文章接介紹如何在OpenW
V2G雙向充電是指,電動車及電網具有雙向充放電的功能,電力系統往往都是單向性,由電網輸電力給終端使用者,但在智慧電網的應用場景中,透過有V2G技術的電動車及充電樁,電動車內的電池能反向將電力回饋給電網,作為電力調度使用。 例如:在用電尖峰時段,若區域A的電力不足,可將位於區域B的電動車內的電能調度至
使用者想操作市面上的路由器,能操作的功能都受限於裝置提供商的限制;但若將路由器刷成類似於Linux的OpenWRT文件系統,不但可解決此問題,還有多達1000以上的功能安裝包可供使用者選擇,非常便於使用者開發。 將路由器韌體刷成OpenWRT系統,其實就是在路由器上安裝OpenWRT的概念,常見的方
當大量的網路封包在有限的頻寬中傳輸,總有一些服務的封包會因為搶不過其他封包而造成卡頓,例如玩遊戲時,若同時也在下載其他大型檔案,就會造成遊戲卡頓甚至斷線。這時候客製化QOS來決定哪些封包能優先被傳送,就能有效地提升指定服務的順暢度,進而提升使用者在網路上的體驗。 本篇文章接介紹如何在OpenW
V2G雙向充電是指,電動車及電網具有雙向充放電的功能,電力系統往往都是單向性,由電網輸電力給終端使用者,但在智慧電網的應用場景中,透過有V2G技術的電動車及充電樁,電動車內的電池能反向將電力回饋給電網,作為電力調度使用。 例如:在用電尖峰時段,若區域A的電力不足,可將位於區域B的電動車內的電能調度至
使用者想操作市面上的路由器,能操作的功能都受限於裝置提供商的限制;但若將路由器刷成類似於Linux的OpenWRT文件系統,不但可解決此問題,還有多達1000以上的功能安裝包可供使用者選擇,非常便於使用者開發。 將路由器韌體刷成OpenWRT系統,其實就是在路由器上安裝OpenWRT的概念,常見的方
你可能也想看
Google News 追蹤
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
理解一個全新的操作環境有時候可能是一個挑戰,尤其對於那些剛開始接觸VS Code的開發者來說,即便具備一定的英文閱讀能力,可能也會對這個陌生的操作環境感到徬徨和不安。不過,沒有必要擔心,我們接下來就來一起用短短的一分鐘時間,將VS Code轉換成最熟悉的中文環境吧! 安裝繁體中文語言包 由於VS
Thumbnail
如果實在找不到可用的替代軟體,或者就是要用指定的軟體不可,那麼虛擬機器可以作為在使用Linux時的一個應對方案。
Thumbnail
在學習C#之前,必須先建立開發環境,例如安裝Visual Studio或其他IDE,並且建立第一個C#專案。可以在Visual Studio中或使用dotnet CLI來建立各種類型的專案。
Thumbnail
新系統建構時,可考慮採購建置VM機器,DB機器,備份機器以及網路設備等硬體機器。
Thumbnail
到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
你好,在下最近在學習開發web,學了html css js,也得出一些心得,由於網路上已有許多教學,所以我會著重在如何開發出to do List,以及解釋我寫的程式碼。相關的教學我會直接貼網址。如果我有什麼地方出錯,或者是可以寫得更好,歡迎在下方留言,討論。 首先先介紹我的開發環境: 我用了vs
Thumbnail
理解一個全新的操作環境有時候可能是一個挑戰,尤其對於那些剛開始接觸VS Code的開發者來說,即便具備一定的英文閱讀能力,可能也會對這個陌生的操作環境感到徬徨和不安。不過,沒有必要擔心,我們接下來就來一起用短短的一分鐘時間,將VS Code轉換成最熟悉的中文環境吧! 安裝繁體中文語言包 由於VS
Thumbnail
如果實在找不到可用的替代軟體,或者就是要用指定的軟體不可,那麼虛擬機器可以作為在使用Linux時的一個應對方案。
Thumbnail
在學習C#之前,必須先建立開發環境,例如安裝Visual Studio或其他IDE,並且建立第一個C#專案。可以在Visual Studio中或使用dotnet CLI來建立各種類型的專案。
Thumbnail
新系統建構時,可考慮採購建置VM機器,DB機器,備份機器以及網路設備等硬體機器。
Thumbnail
到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護