1. 程式人生 > >嵌入式C語言編譯器

嵌入式C語言編譯器

alt text 本地 rec library bfc 產品 二進制文件 strong

1.嵌入式C語言編譯器

1.1 GCC與gcc

上述兩者的區別:
GCC(GUN Compiler Colletion),是指GUN編譯器集合包含眾多語言得到編譯器如C語言(gcc),C++(g++),Java語言(jdk)、D語言(gdc)、等
gcc 則指的是單純的C語言編譯器
當代的嵌入式開發已經和傳統的嵌入式開發不同,硬件性能的提升使其越來越接近桌面開發,使用的開發語言也越來越多樣,內核和驅動開發使用C語言,應用開發使用gcc/g++/gdc等。

1.2交叉編譯

兩種開發模式:
A.非嵌入式開發:A(類)機編寫(源代碼)、編譯得到可執行程序,發布給A(類)機運行。
B.嵌入式開發 :A(類)機編寫(源代碼)、編譯得到可執行程序,發布給B(類)機運行。

為何使用交叉編譯
嵌入式產品由於資源受限,不能直接在嵌入式產品上進行編程,所以選擇在PC主機上進行源碼編寫和編譯,最終生成在嵌入式設備上運行的程序。
交叉編譯可以用高性能機器為低性能機器開發軟件(包括裸機軟件、系統級和應用級軟件)
交叉編譯特點:
必須使用專用的交叉編譯工具鏈。由於可執行程序不能本地運行調試,因此必須配合一定手段(專用調試器、JTAG調試器、USB下載、串口下載、SD啟動、網絡共享等)將可執行程序加載到目標嵌入式設備上運行及調試。
gcc如何進行交叉編譯?
配置目標主機的編譯工具鏈(如arm-linux),配置工具鏈的具體版本。
根據具體的目標代碼選擇相應的工具鏈版本
正確使用關於硬件體系結構的特殊編譯選項
大型企業嵌入式開發環境:
技術分享圖片

1.3編譯過程

我們通常所將的編譯器實際上是指廣義的編譯器,包含下面四個部分:
技術分享圖片
整個編譯過程如下面所示:
技術分享圖片
預處理器完成:頭文件原地展開、宏定義替換、註釋刪除工作。
編譯器(狹義上的):完成各種語言到目標平臺的會變文件的翻譯工作。
匯編器:將平臺回避那文件編譯成最終的二進制文件(.O文件)
鏈接器:將最終的二進制文件按照連接腳本的內容,鏈接稱為最中的可執行文件Linux中為elf文件。
整個過程:源碼.c->(預處理)->預處理過的.i源文件->(編譯)->匯編文件.S->(匯編)->目標文件.o->(鏈接)->elf可執行程序

1.4多語言混合開發

多語言混合開發時當代開發中常見的開發方式,優勢在於節省人力成本,提高開發效率。
方式一:目標平臺匯編文件的統一
技術分享圖片
行業案例:
技術分享圖片
方式二:目標平臺二進制文件的統一
技術分享圖片
行業案例:
技術分享圖片
方式三:利用進程間通信進行協同
技術分享圖片
行業案例:
技術分享圖片

1.5 gcc 編譯選項

預處理指令: gcc -E file.c -o file.i
編譯指令 : gcc -S file.i -o file.s
匯編指令 : gcc -c file.s -o file.o

生成映射文件: gcc test.c -Wl,-Map=test.map (註意逗號後面沒有空格)
宏定義:gcc test.c -D ‘TEST="PENGCHAO"‘ gcc test.c -D TEST=110
獲取系統頭文件路徑; gcc -v file.c

獲取目標的完整依賴關系:gcc -M test.c
獲取目標的部分依賴關系:gcc -MM test.c

制定庫文件及庫文件的搜索路徑
-L 指令庫文件搜索路徑
-l 指定庫文件名
gcc test.c -L -lfunc

靜態庫生成命令:ar -rc libfunc.a func.o
動態庫生成命令:gcc func.c -o func.o -c -fPIC
gcc -o libfunc.so func.o -shared
nm命令也很有用,它可以用來查看一個.a文件中都有哪些符號
ldd命令:作用是可以在一個使用了共享庫的程序執行之前解析出這個程序使用了哪些共享庫,並且查看這些共享庫是否能被找到,能被解析(決定這個程序是否能正確執行)。
註意:動態鏈接庫運行時需要被加載(運行時環境在執行test程序的時候發現他動態鏈接了libfunc.so,於是乎會去固定目錄(/user/lib)嘗試加載libfunc.so,如果加載失敗則會打印:error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory
解決辦法:將動態庫文件拷貝到系統庫文件目錄(不推薦)
將動態庫文件所在目錄導出到環境變量LD_LIBRARY_PATH

嵌入式C語言編譯器