最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GCC 編譯c程序的方法及過程解析

 更新時間:2021年04月11日 11:13:50   投稿:mdxy-dxy  
目前 Linux 下最常用的 C 語言編譯器是 GCC ( GNU Compiler Collection ),它是 GNU 項目中符合 ANSI C 標準的編譯系統(tǒng),能夠編譯用 C 、 C++ 和 Object C 等語言編寫的程序

目前 Linux 下最常用的 C 語言編譯器是 GCC ( GNU Compiler Collection ),它是 GNU 項目中符合 ANSI C 標準的編譯系統(tǒng),能夠編譯用 C 、 C++ 和 Object C 等語言編寫的程序。 GCC 不僅功能非常強大,結(jié)構(gòu)也異常靈活。最值得稱道的一點就是它可以通過不同的前端模塊來支持各種語言,如Java 、 Fortran 、 Pascal 、 Modula-3 和 Ada 等。開放、自由和靈活是 Linux 的魅力所在,而這一點在 GCC 上的體現(xiàn)就是程序員通過它能夠更好地控制整個編譯過程。在使用 GCC 編譯程序時,編譯過程可以被細分為四個階段:

預處理( Pre-Processing )
編譯( Compiling )
匯編( Asse mbling )
鏈接( Linking )

Linux 程序員可以根據(jù)自己的需要讓 GCC 在編譯的任何階段結(jié)束,以便檢查或使用編譯器在該階段的輸出信息,或者對最后生成的二進制文件進行控制,以便通過加入不同數(shù)量和種類的調(diào)試代碼來為今后的調(diào)試做好準備。和其它常用的編譯器一樣, GCC 也提供了靈活而強大的代碼優(yōu)化功能,利用它可以生成執(zhí)行效率更高的代碼。
GCC 提供了 30 多條警告信息和三個警告級別,使用它們有助于增強程序的穩(wěn)定性和可移植性。此外, GCC 還對標準的 C 和 C++ 語言進行了大量的擴展,提高程序的執(zhí)行效率,有助于編譯器進行代碼優(yōu)化,能夠減輕編程的工作量。

C 程序的編譯過程主要分為四個階段:pre-processing,compiling,assembling,linking;

常用文件的后綴名:

gcc 預處理階段:主要對包含的頭文件(#include )和宏定義(#define,#ifdef … )進行處理??梢允褂谩癵cc -E” 讓gcc 在預處理之后停止編譯過程,生成 *.i 文件。

[root@localhost gcc]# gcc -E hello.c -o hello.i

gcc 編譯階段:gcc 首先要檢查代碼的規(guī)范性,是否有語法錯誤等。以確定代碼實際要做的工作,在檢查無誤后,gcc 把代碼翻譯成匯編語言。用戶可以使用-S 選項進行查看,該選項只進

行編譯而不進行匯編,生成匯編代碼。

[root@localhost gcc]# gcc -S hello.i -o hello.s

gcc 匯編階段:生成目標代碼 *.o ;有兩種方式:使用 gcc 直接從源代碼生成目標代碼 gcc -c *.s -o *.o 以及使用匯編器從匯編代碼生成目標代碼 as *.s -o *.o

[root@localhost gcc]# gcc -c hello.s -o hello.o
[root@localhost gcc]# as hello.s -o hello.o

也可以直接使用as *.s, 將執(zhí)行匯編、鏈接過程生成可執(zhí)行文件a.out, 可以像上面使用-o 選項指定輸出文件的格式。
gcc 鏈接階段:生成可執(zhí)行文件;可以生成的可執(zhí)行文件格式有: a.out/*/,當然可能還有其它格式。

[root@localhost gcc]# gcc hello.o 生成可執(zhí)行文件 a.out
[root@localhost gcc]# gcc hello.o -o hello 生成可執(zhí)行文件 hello

gcc 常用編譯選項:


-Dmacro 定義指定的宏,使它能夠通過源碼中的 #ifdef 進行檢驗;

-O 、 -O2 、 -O3 將優(yōu)化狀態(tài)打開,該選項不能與 -g 選項聯(lián)合使用;
-v 啟動所有警報,打印編譯過程的信息;
-Wall 在發(fā)生警報時取消編譯操作,即將警報看作是錯誤;
-Werror 在發(fā)生警報時取消編譯操作,即把報警當作是錯誤;
-w 禁止所有的報警。

gcc 鏈接庫文件的使用

在 linux 下開發(fā)軟件時,完全不使用第三方函數(shù)庫的情況是比較少見的,通常來講都需要借助一個或多個函數(shù)庫的支持才能夠完成相應的功能。從程序員的角度看,函數(shù)庫實際上就是一些頭文件( .h )和庫文件( .so 或者 .a )的集合。雖然 Linux 下的大多數(shù)函數(shù)都默認將頭文件放到/usr/include/ 目錄下,而庫文件則放到 /usr/lib/ 目錄下,但并不是所有的情況都是這樣。正因如此, GCC 在編譯時必須有自己的辦法來查找所需要的頭文件和庫文件。 GCC 采用搜索目錄的辦法來查找所需要的文件, -I 選項可以向 GCC 的頭文件搜索路徑中添加新的目錄。例如,如果在/home/justin/include/ 目錄下有編譯時所需要的頭文件,為了讓 GCC 能夠順利地找到它們,就可以使用 -I 選項:

# gcc foo.c -I /home/justin/include -o foo

同樣,如果使用了不在標準位置的庫文件,那么可以通過 -L 選項向 GCC 的庫文件搜索路徑中添加新的目錄。例如,如果在 /home/xiaowp/lib/ 目錄下有鏈接時所需要的庫文件 libfoo.so ,為了讓 GCC 能夠順利地找到它,可以使用下面的命令:

# gcc foo.c -L /home/justin/lib -lfoo -o foo

值得好好解釋一下的是 -l 選項,它指示 GCC 去連接庫文件 libfoo.so 。
Linux 下的庫文件在命名時有一個約定,那就是應該以lib 三個字母開頭,由于所有的庫文件都遵循了同樣的規(guī)范,因此在用-l 選項指定鏈接的庫文件名時可以省去lib 三個字母,也就是說GCC 在對-lfoo 進行處理時,會自動去鏈接名為libfoo.so
Linux 下的庫文件分為兩大類分別是動態(tài)鏈接庫(通常以.so 結(jié)尾)和靜態(tài)鏈接庫(通常以.a 結(jié)尾),兩者的差別僅在程序執(zhí)行時所需的代碼是在運行時動態(tài)加載的,還是在編譯時靜態(tài)加載的 。默認情況下,GCC 在鏈接時優(yōu)先使用動態(tài)鏈接庫,只有當動態(tài)鏈接庫不存在時才考慮使用靜態(tài)鏈接庫,如果需要的話可以在編譯時加上-static 選項,強制使用靜態(tài)鏈接庫。例如,如果在home/justin/lib/ 目錄下有鏈接時所需要的庫文件libfoo.so 和libfoo.a ,為了讓GCC 在鏈接時只用到靜態(tài)鏈接庫,可以使用下面的命令:

# gcc foo.c -L /home/justin/lib -static -lfoo -o foo 的文件。

對于動態(tài)庫和靜態(tài)庫文件的創(chuàng)建方法,此處不作詳細解釋,可以參考另外一篇linux c 庫文件創(chuàng)建方法。

linux下使用gcc編譯運行C/C++程序

編譯C

首先,程序編譯過程有:

1.預處理(展開宏,頭文件,檢查代碼是否有誤)

2.編譯(將.c轉(zhuǎn)為匯編代碼.s)

3.匯編(將匯編代碼.s轉(zhuǎn)為機器代碼.o)

4.鏈接(將所有機器代碼.o和庫文件鏈接成一個可執(zhí)行程序)

一般編譯常常包括了:預處理,編譯,匯編

在linux系統(tǒng)中,編譯c使用gcc編譯器,如下:

gcc -o out in1.c in2.c //gcc編譯以及鏈接(對in1文件和in2文件進行編譯生成out.bin文件,“-o”:表示生成可執(zhí)行文件)
gcc -c in1.c in2.c -o out.o //gcc編譯不鏈接(對in1文件和in2文件文件進行編譯生成out.o文件,
“-c”:表示只生成*.o文件 第二個"-o":表示制定生成哪個.o文件)

(若只對單個文件編譯及鏈接,也可以直接輸入: gcc in.c, 系統(tǒng)默認編譯生成a.out可執(zhí)行文件)

若需要在arm板里運行,就需要在linux系統(tǒng)中使用arm-linux-gcc交叉編譯才行:

arm-linux-gcc -o out in1.c in2.c //gcc編譯以及鏈接(對in1文件和in2文件進行編譯生成out.bin文件,“-o”:表示生成可執(zhí)行文件)
arm-linux-gcc -c in1.c in2.c -o out.o // gcc編譯不鏈接(對in1文件和in2文件文件進行編譯生成out.o文件,
“-c”:表示只生成*.o文件 第二個"-o":表示指定生成哪個.o文件)

-I //表示添加頭文件位置
一般編譯程序時,說找到不到某個頭文件時,編譯時直接加上"-I 該頭文件目錄",即可編譯OK

-l //指定庫文件,l后面緊跟庫文件,比如數(shù)學庫:-lm,對應著libm.so文件,只需要去掉lib和.so即可
編譯程序時,一般說找不到某函數(shù)定義時,說不定就是沒加庫文件原因,比如找不到cos()函數(shù)定義,則編譯時直接加上"-lm"即可

編譯C++

方法和上面類似,使用g++編譯器,只不過該編譯器會自動鏈接C++庫

注意:若需要c++11標準,需要gcc 4.8以上

以編譯兩個C文件(a.c和hello.c)為示例:

vi a.c //編輯a.c , 它將被hello.c調(diào)用,前提是這兩個文件必須在同一目錄下

內(nèi)容如下:

vi hello.c //編輯hello.c

內(nèi)容如下:

gcc -o hello hello.c a.c //gcc編譯以及鏈接(對hello.c文件和a.c文件進行編譯生成hello.bin文件,“-o”:表示生成可執(zhí)行文件)

./hello //運行hello.bin

效果如下所示:

到此這篇關(guān)于GCC 編譯c程序的方法及過程解析的文章就介紹到這了,更多相關(guān)GCC 編譯c程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談C++ 緩沖區(qū)(buffer)的使用

    淺談C++ 緩沖區(qū)(buffer)的使用

    緩沖區(qū)是用來存放流中的數(shù)據(jù),本文詳細的介紹了C++ 緩沖區(qū)(buffer)的使用,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語言實現(xiàn)可增容動態(tài)通訊錄詳細過程

    C語言實現(xiàn)可增容動態(tài)通訊錄詳細過程

    這篇文章主要為大家介紹了C語言實現(xiàn)簡易通訊錄的完整流程,此通訊錄還可以增容,并且每個環(huán)節(jié)都有完整代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-05-05
  • c語言重要的字符串與內(nèi)存函數(shù)

    c語言重要的字符串與內(nèi)存函數(shù)

    這篇文章主要介紹一些c語言中常用字符串函數(shù)和內(nèi)存函數(shù)的使用和注意事項,并且為了幫助讀者理解和使用,也都模擬實現(xiàn)了他們的代碼,需要的朋友可以參考一下
    2021-09-09
  • c語言實現(xiàn)的帶通配符匹配算法

    c語言實現(xiàn)的帶通配符匹配算法

    這篇文章主要介紹了c語言實現(xiàn)的帶通配符匹配算法,需要的朋友可以參考下
    2015-03-03
  • Qt兩種定時器使用實現(xiàn)方式

    Qt兩種定時器使用實現(xiàn)方式

    這篇文章主要給大家介紹了關(guān)于Qt兩種定時器使用實現(xiàn)方式的相關(guān)資料,Qt中的定時器類是QTimer,QTimer不是一個可見的界面組件,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • C語言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷

    C語言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷的相關(guān)資料,為了加快查找節(jié)點的前驅(qū)和后繼。對二叉樹的線索化就是對二叉樹進行一次遍歷,在遍歷的過程中檢測節(jié)點的左右指針是否為空,如果是空,則將他們改為指向前驅(qū)和后繼節(jié)點的線索,需要的朋友可以參考下
    2017-08-08
  • C++之類和對象課后習題簡單實例

    C++之類和對象課后習題簡單實例

    下面小編就為大家?guī)硪黄狢++之類和對象課后習題簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • C++?OpenGL實現(xiàn)旋轉(zhuǎn)立方體的繪制

    C++?OpenGL實現(xiàn)旋轉(zhuǎn)立方體的繪制

    這篇文章主要主要為大家詳細介紹了如何利用C++和OpenGL實現(xiàn)旋轉(zhuǎn)立方體的繪制,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起動手嘗試一下
    2022-07-07
  • C++實現(xiàn)數(shù)據(jù)文件存儲與加載

    C++實現(xiàn)數(shù)據(jù)文件存儲與加載

    這篇文章主要為大家詳細介紹了C++實現(xiàn)數(shù)據(jù)文件存儲與加載,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 詳解散列表算法與其相關(guān)的C語言實現(xiàn)

    詳解散列表算法與其相關(guān)的C語言實現(xiàn)

    這篇文章主要介紹了詳解散列表算法與其相關(guān)的C語言實現(xiàn),平時經(jīng)常出現(xiàn)于各大考試競賽與程序員面試題目當中,需要的朋友可以參考下
    2015-08-08

最新評論

乌海市| 望城县| 耒阳市| 清河县| 游戏| 县级市| 汶川县| 周至县| 天祝| 紫阳县| 天等县| 洞头县| 博乐市| 宜城市| 锡林郭勒盟| 宜良县| 新绛县| 延寿县| 桃园县| 阿城市| 扶绥县| 周宁县| 六枝特区| 卢氏县| 马龙县| 洛南县| 汽车| 平顶山市| 永登县| 天门市| 三原县| 平泉县| 岱山县| 远安县| 武胜县| 昭苏县| 凤庆县| 西和县| 久治县| 剑川县| 梁山县|