日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gcc学习(一)[第二版]

發布時間:2025/3/17 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gcc学习(一)[第二版] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

gcc簡介

1、 gcc是GNU?Compiler?Collection的縮寫。最初是作為C語言的編譯器(GNU?C??Compiler),作者為Richard?Stallman,是GNU項目的奠基者;現在已經支持多種語言,如C、C++、Java、Pascal、Ada、COBOL語言等?。

?

2、主要特征:

gcc是一個可移植的編譯器,支持多種硬件平臺,甚至對Don?Knuth?設計的?MMIX?這類不常見的計算機都提供了完善的支持?

gcc不僅僅是個本地編譯器,它還能跨平臺交叉編譯(在本地編譯的程序,可以運行在其他平臺之上)。

gcc有多種語言前端,用于解析不同的語言。

gcc是按模塊化設計的,可以加入新語言和新CPU架構的支持

gcc是自由軟件

?

gcc編譯程序的過程

?

1)預處理(Pre-Processing) [-E] #頭文件展開

2)編譯(Compiling) [-S]

3)匯編(Assembling) [-c]?

4)鏈接(Linking) [不加任何選項]

?

?

常用選項

選項

作用

-E

預處理,生成.i文件

-S

編譯,生成.s匯編文件

-c

匯編,編譯源碼生成.o目標文件

Null

鏈接,并不需要任何選項

-o

生成目標文件,如.i,.o,.s,可執行文件,默認為a.out文件等

-Wall

使gcc對源代碼有問題的地方發出警告

-I[dir]

將dir加入頭文件的搜索路徑

-L[dir]

將dir加入庫文件的搜索路徑

-l[lib]

鏈接lib

-g

在目標文件中嵌入調試信息,以便gdb調試程序調試

-O

優化編譯后的代碼

-w

關閉所有警告信息[不推薦]

?

?

示例

//測試程序 #include <stdio.h>#define HELLO "Hello World!!!\n"int main(int argc,char *argv[]) {printf(HELLO);return 0; }
?

操作:

gcc?-E?hello.c?-o?hello.i(預處理)

?

?

gcc?-S?hello.i?-o?hello.s(編譯,生成匯編代碼)

?

?

gcc?-c?hello.s?-o?hello.o(匯編,生成二進制代碼)

?

?

gcc?hello.o?-o?hello(鏈接:不需要額外選項,生成可執行文件)

?

?


gcc?hello.c?-o?hello(直接編譯鏈接成可執行目標文件)

gcc?-c?hello.c或gcc?-c?hello.c?-o?hello.o(編譯生成可重定位目標文件)

?

-Wall的使用

建議初學都加上-Wall選項。有些程序不加-Wall選項,編譯器不報任何錯誤,但是得到的結果卻不是預期的。如下:

//bad.c #include <stdio.h>int main(int argc,char *argv[]) {printf("2 + 2 = %f\n",4);return 0; }


gcc編譯多個文件

一次性編譯

gcc?[-Wall]?hello_fn.c?main.c?–o?newhello

?

獨立編譯

gcc?-Wall?-c?main.c?-o?main.o

gcc?-Wall?-c?hello_fn.c?-o?hello_fn.o

gcc?-Wall?main.o?hello_fn.o?-o?newhello #鏈接生成可執行文件

優點:如果只是改動了一個模塊,則不用再次編譯全部模塊,以節省編譯時間[推薦]

?

附-測試程序

//hello_fu.h #ifndef _HELLO_FUN_H #define _HELLO_FUN_Hvoid hello(const char *str);#endif
//hello_fu.c #include <stdio.h> #include "hello_func.h"void hello(const char *str) {printf("Hello %s\n",str);printf("Compiled: "__DATE__" at "__TIME__"\n");printf("This is line %d of file %s\n",__LINE__,__FILE__);return; }
//main.c #include "hello_func.h"int main() {hello("world");return 0; }

附-Makefile

CC?=?gcc?

CFLAGS?=?-Wall?-g

?

BIN?=?main

SOURCES?=?$(wildcard?*.c)

OBJECTS?=?$(SOURCES:.c=.o)

?

.PHONY:?all?clean

?

all:?$(BIN)

$(BIN):?$(OBJECTS)

$(CC)?$(CFLAGS)?-o?$@?$^

?

%.o:?%.c?

$(CC)?$(CFLAGS)?-c?$<?-o?$@

?

clean:

-rm?-rf?$(BIN)?$(OBJECTS)


gcc需要識別文件擴展名

?

擴展名

含義

.c

C源文件

.cpp/cc

C++源文件

.o

目標文件

.s

匯編語言源文件

.a/.so

編譯后的庫文件

?

?

?

用gcc發現出錯之處

?

發現是在鏈接階段出了錯!

?

?

C/C++編譯完成之后的代碼是不同的


?


總結

以上是生活随笔為你收集整理的gcc学习(一)[第二版]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。