arm+uClinux的嵌入式系統(tǒng)的開發(fā)
練,對提高效率很有幫助。(將你的程序用兩個編輯器完成,一半是用emacs的,一半是不用emacs的,看看效果:-) 對具體的linux編程我就不板門弄斧了,需要提個醒的是咱硬件出身的人作軟件應(yīng)該養(yǎng)成良好的編程習(xí)慣,別讓作軟件的笑話咱。因為作了些網(wǎng)絡(luò)應(yīng)用,所以介紹一些網(wǎng)絡(luò)編程時要用到的網(wǎng)站和書籍; <>w.Richard.Stevens. 這可是linux網(wǎng)絡(luò)編程的圣經(jīng)級的書籍 ::URL::http://www.fanqiang.com/a4/b7/ 適合于網(wǎng)絡(luò)編程的入門。 還有IBM中國上關(guān)于linux的教程和文章,都是翻譯過來的,有很多寫非常不錯。 其實類似的資源不計其數(shù),遇到問題時應(yīng)該先到google上狂搜一圈。 重點想說些關(guān)于編譯器的東西,不了解它,在交叉編譯環(huán)境下編譯程序就寸步難行了,這無非是因為交叉編譯環(huán)境下目標(biāo)板編譯器所處的寄人籬下的悲慘環(huán)境。想想在 linux下將myprogram.c編譯鏈接成應(yīng)用程序myprogram,最簡單的一句 gcc –o myprogram myprogram.c 就可以了。(其實在諸如VC下你也可以找到類似的命令,集成開發(fā)環(huán)境只不過替你來調(diào)用它了)。一切看起來天經(jīng)地義。 但試著把/usr/include路徑改一個名字(比如改成stupid_include),再這樣編譯一下,會發(fā)現(xiàn)程序中被< >引用的頭文件(比如#include)都找不到了。因為編譯器看見這樣的頭文件會到系統(tǒng)指定的路徑下尋找,而這個路徑是由環(huán)境變量保存的(linux和windows下都是這樣的)。針對以上情況,不將路徑名字改回去,但是給編譯器加一個參數(shù)如下: gcc –I/usr/stupid_include –o myprogram myprogram.c 會發(fā)現(xiàn)錯誤信息沒了,一切又恢復(fù)了往日的寧靜,頓時明白,不用環(huán)境變量,通過參數(shù),同樣可以將這些信息告訴編譯器。返回來說說你的目標(biāo)編譯器,雖然占用了人家的地盤,編譯器,頭文件,庫文件,一個都不少,但你要編一個程序編譯器照樣發(fā)暈,因為沒有環(huán)境變量告訴它自己需要的頭文件和庫文件在哪里??磥碇挥袃煞N辦法,一個是搶占了主機的環(huán)境變量改成自己的(整個兒一個土匪),或者在編譯時加上必要參數(shù)(還是這樣紳士一些),告訴編譯器需要的文件的位置。(除此之外,還有其他一些參數(shù)也是如此)。 從源程序到可執(zhí)行文件根據(jù)情況不同可能分好幾步,一般每一步可能都會有一個應(yīng)用程序?qū)崿F(xiàn),像gnu提供的arm開發(fā)工具鏈其實就是這么一組程序。提供從編譯到鏈接到格式轉(zhuǎn)化的全套服務(wù)。你可以用arm-elf-gcc命令一步到底直接產(chǎn)生可執(zhí)行文件(其實也是在自己的任務(wù)完成后調(diào)用下一個程序),也可以每一步加上自己的參數(shù),只作自己的事。 編譯器的主要參數(shù)的使用下次將程序的移植時再講。這里想說一下編譯器產(chǎn)生應(yīng)用程序的幾個主要步鄹,講這個問題的原因還是很多人無法區(qū)分諸如編譯和鏈接,不用問,這一切還是IDE集成開發(fā)環(huán)境惹的禍。有人會說,IDE招你惹你了,你老貶它。其實不然,首先以上說的東西一般在IDE的project菜單下的 option或build option中找到,只是一般不用管罷了。另一個方面,IDE就像是傻瓜照相機,很多工作他都幫你完成了,使用簡單。但如果要做攝影師的話,你就少不了要對每一個細節(jié)都了解。其實編譯程序也是一樣。(你可以對優(yōu)化,警告級,宏定義等諸多選項進行自己的選擇)。以下是幾個主要步鄹:(以下有些我也不確認,如發(fā)現(xiàn)問題,請及時糾正。 (1) 預(yù)編譯。主要工作就是處理所有#開頭的,包括頭文件。以前搞不清頭文件和可執(zhí)行文件有沒有什么聯(lián)系(因為總看見兩個文件名字取一樣的),現(xiàn)在知道,他們之間沒有任何聯(lián)系。在預(yù)編譯結(jié)束后,頭文件的使命就結(jié)束了。在下一次介紹不同平臺程序移植時可以看到,預(yù)編譯有時非常有用。 (2) 編譯。編譯應(yīng)該是最主要的一步,就是將源文件生成CPU能識別的語言,一般是后綴為.o的目標(biāo)文件,應(yīng)該說,此時的文件就已經(jīng)可以執(zhí)行了。當(dāng)然這個時候外部函數(shù)等外部符號都沒有引入,對于被編譯程序來說,這些外部符號還只是留一個倩影,壓根兒不知它在不在。你可以在你的程序里調(diào)用一個不存在的函數(shù),甚至都不用聲明,在編譯階段,很多編譯器只是給個警告。只有在鏈接時才會報錯。(呵呵,夠弱智!) (3) 鏈接:鏈接才是清帳的時候,以前在程序里用到的外部符號都要把真正的東西交出來。你可以指定需要連接在一起的目標(biāo)文件,也可以告訴編譯器庫文件的名字和路徑(指定方法下次講)。編譯器會去找,需要注意的是,庫的指定需要注意順序。首先,如果不同的庫里有同名函數(shù),并且該函數(shù)被調(diào)用,那么在前面的就被鏈接進去了,這一點對于頭文件路徑的指定也適用,如果你自己的頭文件和系統(tǒng)頭文件相同,并且你的頭文件路徑在系統(tǒng)頭文件路徑前面,你的頭文件就會代替頭文件。庫文件是由相應(yīng)的程序(linux下是ar命令)將需要被添加到庫里的目標(biāo)文件(該文件是編譯階段生成的)組織起來生成檔案文件,同時可以建立一個檢索,檢索內(nèi)容為所包含的目標(biāo)文件中定義的符號。也就是說,庫文件并不是必須的,但它為經(jīng)常使用的目標(biāo)文件中的函數(shù)提供了快速的檢索機制。 以上就是主要的步鄹,當(dāng)然除此之外,還有一些用于格式轉(zhuǎn)換的工具等。不一一介紹。知道編譯器的細節(jié)對于程序的開發(fā)和移植都是很有好處的。 程序開發(fā)過程中調(diào)試也是至關(guān)重要,因為可以先在主機上調(diào)試,所以可以使用linux下的gdb,(有點像dos 下的debug)。但是只是用到了皮毛,還有一個專用于宿主機模式的調(diào)試工具gdbserver,一直沒時間研究,希望用過的大俠多發(fā)些文章鋪路。 |