真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

嵌入式之C語言編譯器(五)

系統(tǒng)運維

我們在嵌入式的開發(fā)中經(jīng)常會見到 GCC 和 gcc,那么它們兩有何不同呢?GCC(GNU Compile Collection) 是指 GNU 編譯器集合,包含眾多語言的編譯器,如 C、C++、Java、D、Objective-C 等;而 gcc 則是特指 GCC 中的 C 語言編譯器。那么 GCC 與嵌入式的關(guān)系是怎樣的呢?多數(shù)嵌入式操作系統(tǒng)都是基于 GCC 進(jìn)行源碼編譯,如 Linux、VxWorks 以及 Android 等。在實際的開發(fā)中,內(nèi)核相關(guān)的開發(fā)用的是 gcc,而應(yīng)用開發(fā)用的是 gcc/g++/gdc 等。

容縣網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計等網(wǎng)站項目制作,到程序開發(fā),運營維護(hù)。創(chuàng)新互聯(lián)公司于2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

下來我們來看看一個嵌入式開發(fā)中的高端大氣上檔次的詞語:交叉編譯。那么為什么會有交叉編譯呢?在以往的嵌入式設(shè)備往往都是資源受限的,不可能直接在嵌入式上直接對處理器進(jìn)行編程。那么此時的解決方案便是在開發(fā)主機(PC)上對源碼進(jìn)行編譯,最終生成目標(biāo)主機(嵌入式設(shè)備)的可執(zhí)行程序。gcc 是如何進(jìn)行交叉編譯的呢?1、配置目標(biāo)主機的編譯工具鏈(如arm-linux);2、配置工具鏈的具體版本:根據(jù)具體的目標(biāo)代碼選擇相應(yīng)的工具鏈版本,正確使用關(guān)于硬件體系的特殊編譯選項。下來我們來看看大型企業(yè)的嵌入式開發(fā)環(huán)境是怎樣的,如下

這個服務(wù)器集群相當(dāng)于是我們自己公司的內(nèi)部服務(wù)器,版本控制則是指由原來的版本經(jīng)過我們一些代碼的修改之后產(chǎn)生的新版本,用于各個版本的控制的。文件追蹤則是指在服務(wù)器上面可以看到那部分的代碼是具體由哪個人進(jìn)行改寫的,可具體到文件以及部分代碼。我們來看看編譯器是怎樣的,如下

編譯器其實是由預(yù)處理期、編譯器、匯編器以及鏈接器構(gòu)成的。我們平時所說的由哪個編譯器編譯生成的文件,此時的編譯器便是指廣范圍的編譯器。那么狹義上的編譯器則是指我們在平時所聽到的生產(chǎn)一個某語言的編譯器,此時的編譯器則是指將具體的語言翻譯成目標(biāo)平臺代碼而已。我們來看看一個 .c 文件是怎樣編譯成 .o 文件的,具體步驟如下所示

我們看到并不是我們所想象的直接一步就由 .c 文件直接編譯成為 .o 可執(zhí)行文件了,而是經(jīng)過那么多的步驟才會生成最終的可執(zhí)行程序的。那么此時便擴展一個問題,我們是如何理解“多語言混合開發(fā)”?我們在平時可能會聽到多語言混合開發(fā),是指由好幾種語言混合進(jìn)行一個應(yīng)用程序開發(fā)的。那么為什么會產(chǎn)生這種混合的開發(fā)方式呢?比如說一個項目是由 C++ 完成的,但是其中的某些部分是可以通過 C# 完成的,此時精通 C++ 的人很少(相應(yīng)工資就要的很高了),而 C# 的工程師由一大堆,我們就可以需要兩個精通 C++ 的工程師和好幾個 C# 的工程師來共同完成這個項目,達(dá)到以最小的開支完成此項目的效果?;蛘呤悄銈冃〗M內(nèi)每個人擅長的語言方向不一樣,為了發(fā)揮每個人的效率便可以采取這種混合開發(fā)的方式。下來我們來看看幾種多語言混合開發(fā)的方式

方式一,如下

此方式是通過由幾種語言經(jīng)過匯編得到目標(biāo)平臺的匯編語言,再由目標(biāo)平臺匯編器統(tǒng)一鏈接生成可執(zhí)行程序。行業(yè)典型的案例就是 .net framework,它便是由 C#、C++ 以及 VB 混合開發(fā)得到的,如下

方式二,如下

它是由各自的語言生成相應(yīng)的庫再通過目標(biāo)平臺鏈接器統(tǒng)一鏈接為可執(zhí)行程序。典型的案例便是 QQ 了,如下

方式三,如下

它是經(jīng)過各自的編譯器先生成可執(zhí)行程序 .exe,再通過進(jìn)程間通信協(xié)議進(jìn)而生成可執(zhí)行程序。行業(yè)案例:Eclipse,如下

下來我們來看看 gcc 關(guān)鍵編譯選項。

gcc 關(guān)鍵編譯選項一:a> 預(yù)處理指令是:gcc -E file.c -o file.i;b > 編譯指令:gcc -S file.i -o file.s;c> 匯編指令:gcc -c file.s -o file.o。

下來我們來看看效果分別是怎樣的

func.h 源碼

#include

voidfunc()
{
#ifdefTEST
printf("TEST=%s\\n",TEST);
#endif

return;
}

test.c 源碼

#include
#include"func.h"

intg_global=0;
intg_test=1;

intmain(intargc,char*argv[])
{
func();

printf("&g_global=%p\\n",&g_global);
printf("&g_test=%p\\n",&g_test);
printf("&func=%p\\n",&func);
printf("&main=%p\\n",&main);

return0;
}

我們來看看預(yù)處理的效果,打開 test.i 文件看看,開頭是這樣的

第一行的 1 表示下面的內(nèi)容是屬于 test.c 文件的內(nèi)容,下面是一些頭文件的包含。

# 2 "test.c" 2 的意思是 test.c 頭文件的包含已經(jīng)結(jié)束了,# 1 "func.h" 1 表示 func.h 相關(guān)內(nèi)容的開始。最后便是 test.c 文件 main 函數(shù)的內(nèi)容了。下面看看編譯指令生成的 .s 文件

都是一些生成的匯編命令。下面來看看最后的匯編指令生成 .o 文件

gcc 關(guān)鍵編譯選項二:a> 生成映射文件:gcc -WI,-Map=test.map file.c;b> 宏定義:gcc -D'TEST="test"' file.c;c> 獲取系統(tǒng)頭文件路徑:gcc -v file.c。

gcc 關(guān)鍵編譯選項三:生成依賴關(guān)系。a> 獲取目標(biāo)完整的依賴關(guān)系:gcc -M test.c;b> 獲取目標(biāo)的部分依賴關(guān)系:gcc -MM test.c。

下來我們來看看 -M 和 -MM 的效果分別是怎樣的,如下

我們看到包含了那么多的頭文件,它的格式類似于 makefile 中的目標(biāo)與依賴的關(guān)系。其中依賴是 test.c 和眾多的頭文件以及我們自己包含的 func.h 頭文件。再來看看 -MM 的效果

我們看到 -MM 的效果是指依賴于 test.c 和 func.h,并沒有那些別的頭文件。

gcc 關(guān)鍵編譯選項四:指定庫文件及庫文件搜索路徑。-L 選項是指定庫文件的搜索路徑;-l 是指定庫文件,如 gcc test.c -L -lfunc。

func.c 源碼

#include

voidfunc()
{
#ifdefTEST
printf("TEST=%s\\n",TEST);
#endif

return;
}

test.c 源碼

#include

intg_global=0;
intg_test=1;

intmain(intargc,char*argv[])
{
func();

printf("&g_global=%p\\n",&g_global);
printf("&g_test=%p\\n",&g_test);
printf("&func=%p\\n",&func);
printf("&main=%p\\n",&main);

return0;
}

編譯結(jié)果如下

我們看到經(jīng)過 ar crs 命令將 func.o 打包成 libfunc.a 文件后,再通過 gcc test.c -L. -lfunc 命令生成可執(zhí)行程序 a.out(其中 -L 后面的點代表在當(dāng)前目錄下)。


分享標(biāo)題:嵌入式之C語言編譯器(五)
標(biāo)題來源:http://weahome.cn/article/chddpe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部