日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

c语言编译生成obj,GCC编译Objective-C源文件

發(fā)布時(shí)間:2024/10/14 97 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言编译生成obj,GCC编译Objective-C源文件 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本章主要講的是使用 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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。