在進行openvpn移植時,因為需要lzo庫和openssl庫的支援,而我又不想生成共享庫,所以採取了靜態編譯的方式。但是在編譯鏈結時錯把-static理解是編譯的引數了,實際上是對於編譯和鏈結的概念還有點模糊。網友孤雲為我舉了乙個例子,如下:
(1)a = gcc b = -o -static
(2)a = gcc -static b = -o
a + b ,對於結果,這兩個是沒有什麼區別的,但是,a 和 b完全就不同了。為了深入理解c語言編譯鏈結的整個流程,我結合華清遠見的linux下的c語言程式設計基礎,實踐之後認識就深刻多了。
一、首先,先對linux下c語言開發的流程有個大體的了解。簡單的說,就是:
1、編寫c程式源***.c
2、預處理(pre-processing)
3、編譯(compiling)
4、彙編(assembling)-->生成目標***.o
5、鏈結(linking)-->生成可執行檔案
6、除錯
其中,第一步工作用編輯器來實現,用emacs、vi(m)都可以。我現在習慣用vim。在redhat9.0中,vim版本為6.1,系統採用alias用vi作為vim的別名,因此在shell提示符下輸入vi實際上使用的編輯器vim(vi improved)。你可以使用which檢視一下:
[armlinux@lqm program]$ which vi
alias vi='vim'
/usr/bin/vim
除去第6步的工作由gdb之類的偵錯程式來完成,中間的四步工作都是由gcc來完成的。
二、下面大體了解一下gcc。
---------------------------------------標準
gcc編譯流程
可以利用gcc的引數來控制執行的過程,這樣就可以更深入的了解編譯c程式的過程。下面將通過對乙個程式的編譯來演示整個過程。includeint main 1 預處理 編譯器將c程式的標頭檔案編譯進來,還有巨集的替換,可以用gcc的引數 e來參看。命令 gcc e hello.c o hello.i 作...
gcc編譯流程
步驟命令 說明預處理 gcc e hello.c o hello.i 1.將所有 define刪除,並且展開所有的巨集定義 2.處理所有的條件預編譯指令,如 if ifdef undef ifndef endif elif 3.處理 include,將包含的檔案插入到此處,這是乙個遞迴的過程 4.刪...
GCC編譯流程
gcc使用的基本語法為 gcc option filename 這裡option是gcc使用時的一些選項,可以通過指定不同的選項實現不同的功能。這裡的filename是gcc要編譯的檔案,gcc會根據使用者指定的編譯選項以及所識別的檔案字尾名來對編譯檔案進行響應的處理。1,預處理階段 預處理功能分為...