Compile C/C++ share object in Linux using GCC and G++ (for dynamic linking library)
這是一份為了在 Linux 佈署專案的筆記,內容使用虛擬機器來建置 Linux 環境,將 C/C++ 的專案程式碼,透過 Code::Blocks IDE,使用 GCC G++ 來編譯 Share objects (*.so files)。
Linux 環境
相較於架設另外一台 Linux 硬體電腦,使用虛擬機器(Virtual machine)來模擬 Linux 環境方便得多了。不用組裝新機器,不用架設網路環境,不需要遠端操控,不需用遠端互傳檔案,不用搞那些硬體就是方便。
軟體使用 VMware Workstation Player 來模擬,Windows 下載安裝程式點一點就安裝好了。
安裝 Linux CentOS,先從 CentOS 網站下載虛擬 DVD ISO 檔案。開啟 VM Player,選擇「Create a New Virtual Machine」,選擇剛剛下載的 ISO 檔案,VM Player 會自動偵測作業系統版本,真是非常貼心。
設定使用者帳號密碼,設定虛擬機器設定檔案安裝位置,設定硬碟空間配置,完成並啟動虛擬機器,會自動開始安裝 CentOS。
虛擬機器設定 Virtual Machine Settings
必須在虛擬機器關機(Power off)下才可以設定。主要設定資料夾分享(Folder Sharing),讓 Linux 可以去讀寫放在主作業系統的程式碼,編譯程式檔案互相傳輸。這裡有安全上的疑慮,若虛擬機器中的惡意程式,在該資料夾隨意進行檔案操作,可能會造成主作業系統損壞。為了方便進行接下來工作,以及能夠承擔風險,因此在這裡設定資料夾分享。
Edit virtual machine settings > Tab Options > Shared Folders
設定好的分享資料夾路徑為:
cd /mnt/hgfs/
GNU GCC G++
安裝 GCC 環境,yum 工具幫了很大的忙,使用以下指令就完成安裝:
su -c 'yum install -y gcc*'
Code::Blocks IDE
沒有 IDE 編譯一切都很不方便,Commands Line 最討厭了。Code::Blocks IDE 是一套免費而且跨平台的 IDE,可以透過官方網站下載 Binary 或者是 Source Code 自行安裝。
最後採用 Jenslody 所提供的 Nightly build 方式進行安裝,先下載 *.repo file,複製該 repo file 到 /etc/yum.repos.d/:
su -c 'cp jenslody-codeblocks.repo /etc/yum.repos.d/'
透過 yum list 來查詢是否 codeblocks 可以安裝:
yum list codeblocks
之後進行安裝,這方法可以不用處理惱人的 Dependency,一切方便簡單,感謝 Jenslody。
su -c 'yum install -y codeblocks.x86_64'
編譯設定 Compile Settings
建立動態連結函式庫(Share object)一些設定:
// Compiler Options
-fPIC
由於編譯的程式碼中有使用全域變數,被強迫要求設定。要編譯器產生跟記憶體位置無關的程式碼(Position-Independent Code),產生程式碼對於記憶體位置的存取全都是相對,而非絕對位置。更多細節請參考說明文件。
// Linker Options
-static-libgcc -static-libstdc++
主要是 GNU Library 預設不是靜態連接(Static linking),沒有如此設定,將在執行時會要求該程式庫。為了避免部署環境沒有該程式庫,所以強迫靜態連結,把該程式庫程式碼編譯進執行檔。
注意:相同編譯環境下,在 Windows 下使用動態連結編譯,會發生找不到程式庫 libgcc_s_dw2-1.dll 的錯誤(The program can't start because libgcc_s_dw2-1.dll is missing.)。
沒有留言: