進入終端,用cd 命令切換到c文件的目錄
臨西ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
編譯命令:gcc -o exec_file (可執(zhí)行文件名) soucre_file.c(源文件)
然后 用命令 ./exec_file 運行
更高級的是用make 工具,自動編譯
新建一個sort.c文件,寫一個最簡單的排序
使用 gcc -o libsort.so -fPIC -shared sort.c 產(chǎn)生libsort.so庫。
.so庫有兩種調(diào)用方法:
新建main.c文件:
使用命令 gcc -o main main.c -lsort -L. 編譯。
新建main2.c文件:
使用命令 gcc -o main2 main2.c -ldl 編譯。動態(tài)加載.so庫的話需要-ldl。
運行./main2后輸出遞增序列,調(diào)用成功。
請慢慢看,真要詳細講起來,文字實在太多了,但是由于時間原因,我只能以粗略的文字講,語言有一些邏輯漏洞,請見諒。
首先我會以粗略的文字回答你的其中一個問題,然后后面會給出第二個問題的答案。
問:什么時候會執(zhí)行這些規(guī)則及其相對應(yīng)的命令?
答:當(dāng)你給make命令指定了它要生成的終極目標(biāo)時,它會從要生成的終極目標(biāo)尋址依賴的依賴條件,然后依賴條件一級一級的查找并執(zhí)行相對應(yīng)的命令。即如果當(dāng)有目標(biāo)需要.s、.o這些依賴條件的時候,會取找要生成.s、.o目標(biāo)的依賴條件,這個時候就會執(zhí)行這些規(guī)則:
.S.s:
$(CPP) $(CFLAGS) $ -o $*.s
.S.o:
$(CC) $(CFLAGS) -c $ -o $*.o
.c.o:
$(CC) $(CFLAGS) -c $ -o $*.o
一、
源代碼文件必須經(jīng)過:預(yù)處理(cpp)、編譯(ccl)、匯編(as)、鏈接(ld)。這四個階段最終才得到可執(zhí)行的程序:
makefile里定義了變量CPP=cpp;其中$(CPP)的意思是去定義變量CPP里的值:cpp,用cpp來預(yù)處理源文件。
$(CFLAGS)的意思是取定義變量CDLAGS里面的值,一般是一些自我定義的預(yù)處理命令和編譯命令的參數(shù)。
$的意思是:在規(guī)則的命令中,表示第一個依賴條件
-o是一個預(yù)處理、編譯等執(zhí)行命令需要的參數(shù)
/*
其實這條命令:$(CPP) $(CFLAGS) $ -o $*.s,就是一條預(yù)處理命令,將一個源文件預(yù)處理為.s文件后綴的文件,*為通配符。那源文件在哪里呢。其實這條命令.S.s: 已經(jīng)說了以.S結(jié)尾的文件就是源文件。那這條命令.S.s這么說了呢?請看下面的后綴規(guī)則講解。
*/
二、
老式風(fēng)格的"后綴規(guī)則"
后綴規(guī)則是一個比較老式的定義隱含規(guī)則的方法。后綴規(guī)則會被模式規(guī)則逐步地取代。因為模式規(guī)則更強更清晰。為了和老版本的Makefile兼容,GNU make同樣兼容于這些東西。后綴規(guī)則有兩種方式:"雙后綴"和"單后綴"。
雙后綴規(guī)則定義了一對后綴:目標(biāo)文件的后綴和依賴目標(biāo)(源文件)的后綴。如".c.o"相當(dāng)于"%o : %c"。單后綴規(guī)則只定義一個后綴,也就是源文件的后綴。
后綴規(guī)則中所定義的后綴應(yīng)該是make所認識的,如果一個后綴是make所認識的,那么這個規(guī)則就是單后綴規(guī)則,而如果兩個連在一起的后綴都被make所認識,那就是雙后綴規(guī)則。例如:".c"和".o"都是make所知道。
因而,如果你定義了一個規(guī)則是".c.o"那么其就是雙后綴規(guī)則,意義就是".c" 是源文件的后綴,".o"是目標(biāo)文件的后綴。如下示例:
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $
其中.c.o:這個命令表示源文件的后綴為.c,目標(biāo)文件的后綴為.o;即也可理解為:生成.o的目標(biāo)文件依賴條件是源文件.c
下面命令是將是所有的.c源文件都編譯成.o的目標(biāo)文件。
注:后綴規(guī)則不允許任何的依賴文件,如果有依賴文件的話,那就不是后綴規(guī)則,那些后綴統(tǒng)統(tǒng)被認為是文件名,
如:
.c.o: foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $
這個例子,就是說,文件".c.o"依賴于文件"foo.h",而不是我們想要的這樣:
%.o: %.c foo.h
$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $
因此后綴規(guī)則不允許任何的依賴文件。
一般是缺少相應(yīng)的頭文件,新建項目時 選擇console application,不要選MFC的那種項目。
主函數(shù)應(yīng)該寫成int main(),你寫成mian了。
鏈接時缺少相關(guān)的庫文件(.a/.so)
在此,只舉個靜態(tài)庫的例子,假設(shè)源碼如下。
先把test.c編譯成靜態(tài)庫(.a)文件
gcc -c test.c
ar -rc test.a test.o
至此,我們得到了test.a文件。我們開始編譯main.c
gcc -c main.c
這時,則生成了main.o文件,然后我們再通過如下命令進行鏈接希望得到可執(zhí)行程序。
gcc -o main main.o
你會發(fā)現(xiàn),編譯器報錯了:
/tmp/ccCPA13l.o: In function `main':
main.c:(.text+0x7): undefined reference to `test'
collect2: ld returned 1 exit status
其根本原因也是找不到test()函數(shù)的實現(xiàn)文件,由于該test()函數(shù)的實現(xiàn)在test.a這個靜態(tài)庫中的,故在鏈接的時候需要在其后加入test.a這個庫,鏈接命令修改為如下形式即可。
gcc -o main main.o ./test.a ?//注:./ 是給出了test.a的路徑
【擴展】:同樣,為了把問題說清楚,上面我們把代碼的編譯鏈接分開了,如果希望一次性生成可執(zhí)行程序,則可以對main.c和test.a執(zhí)行如下命令。
gcc -o main main.c ./test.a ?//同樣,如果不加test.a也會報錯。
格式 gcc [option] [sourcefilename]
介紹一些常用的選項:最簡單的是:gcc hello.c
默認的情況下將生成a.out的可執(zhí)行性文件,你只需要在終端上輸入./a.out就可以看到執(zhí)行的結(jié)果.
如果你想指定生成目標(biāo)文件的名字那么你可以加上 -o選項,命令如下:
gcc -o hello hello.c
命令如下:
gcc -c hello hello.c
在Linux下面,如果要編譯一個C語言源程序,我們要使用gcc編譯器。
先將源文件編譯成目標(biāo)文件:gcc - c hello.c
生成hello.o文件,再將目標(biāo)文件編譯成可執(zhí)行文件:gcc -o hello hello.o
如:
int main(int argc,char **argv)
{
printf("Hello Linux\n");
}
擴展資料:
在使用GCC編譯器的時候,我們必須給出一系列必要的調(diào)用參數(shù)和文件名稱。GCC編譯器的調(diào)用參數(shù)大約有100多個,這里只介紹其中最基本、最常用的參數(shù)。具體可參考GCC Manual。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數(shù),filenames給出相關(guān)的文件名稱。
參考資料:
百度百科_gcc