上述兩者的區(qū)別:
GCC(GUN Compiler Colletion),是指GUN編譯器集合包含眾多語言得到編譯器如C語言(gcc),C++(g++),Java語言(jdk)、D語言(gdc)、等
gcc 則指的是單純的C語言編譯器
當代的嵌入式開發(fā)已經(jīng)和傳統(tǒng)的嵌入式開發(fā)不同,硬件性能的提升使其越來越接近桌面開發(fā),使用的開發(fā)語言也越來越多樣,內(nèi)核和驅(qū)動開發(fā)使用C語言,應用開發(fā)使用gcc/g++/gdc等。
創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務,包含不限于成都做網(wǎng)站、成都網(wǎng)站設計、成都外貿(mào)網(wǎng)站建設、平利網(wǎng)絡推廣、微信小程序開發(fā)、平利網(wǎng)絡營銷、平利企業(yè)策劃、平利品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供平利建站搭建服務,24小時服務熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
兩種開發(fā)模式:
A.非嵌入式開發(fā):A(類)機編寫(源代碼)、編譯得到可執(zhí)行程序,發(fā)布給A(類)機運行。
B.嵌入式開發(fā) :A(類)機編寫(源代碼)、編譯得到可執(zhí)行程序,發(fā)布給B(類)機運行。
為何使用交叉編譯
嵌入式產(chǎn)品由于資源受限,不能直接在嵌入式產(chǎn)品上進行編程,所以選擇在PC主機上進行源碼編寫和編譯,最終生成在嵌入式設備上運行的程序。
交叉編譯可以用高性能機器為低性能機器開發(fā)軟件(包括裸機軟件、系統(tǒng)級和應用級軟件)
交叉編譯特點:
必須使用專用的交叉編譯工具鏈。由于可執(zhí)行程序不能本地運行調(diào)試,因此必須配合一定手段(專用調(diào)試器、JTAG調(diào)試器、USB下載、串口下載、SD啟動、網(wǎng)絡共享等)將可執(zhí)行程序加載到目標嵌入式設備上運行及調(diào)試。
gcc如何進行交叉編譯?
配置目標主機的編譯工具鏈(如arm-linux),配置工具鏈的具體版本。
根據(jù)具體的目標代碼選擇相應的工具鏈版本
正確使用關于硬件體系結構的特殊編譯選項
大型企業(yè)嵌入式開發(fā)環(huán)境:
我們通常所將的編譯器實際上是指廣義的編譯器,包含下面四個部分:
整個編譯過程如下面所示:
預處理器完成:頭文件原地展開、宏定義替換、注釋刪除工作。
編譯器(狹義上的):完成各種語言到目標平臺的會變文件的翻譯工作。
匯編器:將平臺回避那文件編譯成最終的二進制文件(.O文件)
鏈接器:將最終的二進制文件按照連接腳本的內(nèi)容,鏈接稱為最中的可執(zhí)行文件Linux中為elf文件。
整個過程:源碼.c->(預處理)->預處理過的.i源文件->(編譯)->匯編文件.S->(匯編)->目標文件.o->(鏈接)->elf可執(zhí)行程序
多語言混合開發(fā)時當×××發(fā)中常見的開發(fā)方式,優(yōu)勢在于節(jié)省人力成本,提高開發(fā)效率。
方式一:目標平臺匯編文件的統(tǒng)一
行業(yè)案例:
方式二:目標平臺二進制文件的統(tǒng)一
行業(yè)案例:
方式三:利用進程間通信進行協(xié)同
行業(yè)案例:
預處理指令: 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
獲取系統(tǒng)頭文件路徑; gcc -v file.c
獲取目標的完整依賴關系:gcc -M test.c
獲取目標的部分依賴關系:gcc -MM test.c
制定庫文件及庫文件的搜索路徑
-L 指令庫文件搜索路徑
-l 指定庫文件名
gcc test.c -L -lfunc
靜態(tài)庫生成命令:ar -rc libfunc.a func.o
動態(tài)庫生成命令:gcc func.c -o func.o -c -fPIC
gcc -o libfunc.so func.o -shared
nm命令也很有用,它可以用來查看一個.a文件中都有哪些符號
ldd命令:作用是可以在一個使用了共享庫的程序執(zhí)行之前解析出這個程序使用了哪些共享庫,并且查看這些共享庫是否能被找到,能被解析(決定這個程序是否能正確執(zhí)行)。
注意:動態(tài)鏈接庫運行時需要被加載(運行時環(huán)境在執(zhí)行test程序的時候發(fā)現(xiàn)他動態(tài)鏈接了libfunc.so,于是乎會去固定目錄(/user/lib)嘗試加載libfunc.so,如果加載失敗則會打?。篹rror while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory
解決辦法:
A.將動態(tài)庫文件拷貝到系統(tǒng)庫文件目錄(不推薦)
B.將動態(tài)庫文件所在目錄導出到環(huán)境變量LD_LIBRARY_PATH,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path_name