c语言编译生成obj,GCC编译Objective-C源文件
本章主要講的是使用 GCC 編譯 Objective-C。
Objective-C 可以把它看成是 C 語(yǔ)言的擴(kuò)充,同時(shí)它又支持類的使用,所以也是面向?qū)ο蟮木幊陶Z(yǔ)言,通常寫(xiě)作是 ObjC 或者是 OC。它主要用于 Mac OS X 和 GNU step 系統(tǒng)。因?yàn)?GCC 中包含 Objective-C 源程序的編譯器,所以在 Linux 系統(tǒng)上可以開(kāi)發(fā)這種編程語(yǔ)言。但是它與 GCC 編譯的其它語(yǔ)言不同,Objective-C 在 GCC 中沒(méi)有標(biāo)準(zhǔn)定義。
Objective-C相關(guān)的文件類型展示如下:
.a 為靜態(tài)庫(kù)文件,跟C/C++相同
.h 為頭文件
.m 為需要預(yù)處理的 Objective-C 源文件
.mi 為不需要預(yù)處理的 Objective-C 源文件
.o 為適用于連接的目標(biāo)文件格式
.so 為動(dòng)態(tài)鏈接庫(kù)文件
編譯Objective-C源文件
從各種角度上看,Objective-C 程序與 C 程序在編寫(xiě)語(yǔ)法上非常的相似。可以說(shuō)編寫(xiě)不包含對(duì)象的 Objective-C 程序與 C 程序的語(yǔ)法形式完全相同。
實(shí)例:創(chuàng)建一個(gè) Objective-C 文件的源文件 test.m。
/*test.m*/
#import
int main(void)
{
printf("hello world\n");
return 0;
}
編譯源文件的命令如下:
gcc test.m -lobjc -o test
使用上面命令編譯的時(shí)候可能會(huì)報(bào)錯(cuò),如果出現(xiàn)下面的錯(cuò)誤信息:
gcc: error trying to exec ‘cclobj’: execvp: 沒(méi)有那個(gè)文件或目錄
那是因?yàn)槿鄙倭讼嚓P(guān)的庫(kù)文件,可以通過(guò)如下的命令安裝:
sudo apt-get install gobjc gnustep gnustep-devel
如果文件的語(yǔ)法格式?jīng)]有出現(xiàn)錯(cuò)誤,我們?cè)偃?zhí)行的時(shí)候就不會(huì)產(chǎn)生錯(cuò)誤了。這就是使用 gcc 編譯 Objective-C 源文件,編譯時(shí)可以通過(guò)參數(shù)選項(xiàng)-Wno-import來(lái)禁止顯示警告消息。
當(dāng)然,我們也可以看到與 C 語(yǔ)言不同的地方,Objective-C 源程序包含頭文件使用的是 #import 取代了關(guān)鍵字 #include。這兩個(gè)關(guān)鍵字作用是相同的,但是 #import 不僅可以用來(lái)包含頭文件,而且在編譯相同單元的時(shí)侯不會(huì)被多次包括進(jìn)來(lái)。如果想要利用 #include 來(lái)達(dá)到相同的效果,需要在頭文件中使用條件編譯。
選項(xiàng)-lobjc指出使用的庫(kù)是 libobjc.a(Objective-C的對(duì)象庫(kù)),但實(shí)際上對(duì)于沒(méi)有對(duì)象的簡(jiǎn)單程序,這個(gè)選項(xiàng)并不是必須的。編譯程序時(shí),通過(guò)文件名的后綴名 .m 被識(shí)別為 Objective-C 源程序,選項(xiàng)-o用于指定輸出文件的名字,默認(rèn)的輸出文件名也是 a.out。
編譯包含對(duì)象的源文件
Objective-C編程語(yǔ)言是面向?qū)ο蟮木幊陶Z(yǔ)言,我們來(lái)看一下這種編程語(yǔ)言中類的創(chuàng)建和使用。
類方法在書(shū)寫(xiě)上有格式的要求,必須以加號(hào)(+)開(kāi)頭。使用時(shí)只能由類來(lái)調(diào)用,并且不能訪問(wèn)成員變量。
對(duì)象方法在書(shū)寫(xiě)格式上也有要求,以減號(hào)(-)開(kāi)頭。使用時(shí)只能由對(duì)象來(lái)調(diào)用,對(duì)象方法中可以訪問(wèn)當(dāng)前對(duì)象的成員變量。
類在使用的時(shí)候注意事項(xiàng):
Objective-C 是單繼承。
基本上所有類的根類是 NSObject。
不允許子類和父類擁有相同名稱的成員變量。
父類必須聲明在子類前面,實(shí)現(xiàn)不用在子類前。
調(diào)用某個(gè)對(duì)象/類的方法時(shí),優(yōu)先去當(dāng)前對(duì)象/類中找,若找不到去父類中找。
子類會(huì)繼承父類所有的變量不管是否是私有,只是能不能直接訪問(wèn)的問(wèn)題。
父類只在 implementation 里定義的變量,子類也會(huì)繼承。
編譯包含對(duì)象的 Objective-C 源文件。編譯文件使用如下的命令:
gcc main.m -o main.o
gcc Speak.m -o Speak.o
gcc main.o Speak.o -lobjc -o main
我們還可以使用另一種方法:
gcc main.m Speak.m -lobjc -o main
制作靜態(tài)庫(kù)文件
將需要封裝成靜態(tài)庫(kù)文件的源文件編譯生成 .o 目標(biāo)文件:
gcc? test.m? -o test.o
使用 ar 命令制作成靜態(tài)庫(kù)文件:
ar -r libtest.a test.o
通過(guò)上面的流程可以發(fā)現(xiàn),Objective-C 與 C 語(yǔ)言制作靜態(tài)庫(kù)文件的方式,當(dāng)然使用的方法也是相同的,具體的制作流程可以參考 C 語(yǔ)言。
制作共享庫(kù)
為需要封裝的源文件創(chuàng)建目標(biāo)文件:
Gcc -fpic -Wno-import -c test.m -o test.o
需要添加編譯選項(xiàng)-fpic。為了讓編譯的源文件可以載入內(nèi)存中的任何位置,并且能夠從載入的位置執(zhí)行目標(biāo)代碼。
將目標(biāo)文件創(chuàng)建成共享庫(kù):
gcc -shared test.o -o test.so
我們可以將這兩條命令組合成為一條命令:
gcc -fpic -shared test.m -o test.so
總結(jié)
以上是生活随笔為你收集整理的c语言编译生成obj,GCC编译Objective-C源文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 函数调用的参数太少c语言,调用input
- 下一篇: c语言 宏教程 pdf,C语言之详解_i