程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> GCC 編譯c法式的辦法及進程解析

GCC 編譯c法式的辦法及進程解析

編輯:關於C++

GCC 編譯c法式的辦法及進程解析。本站提示廣大學習愛好者:(GCC 編譯c法式的辦法及進程解析)文章只能為提供參考,不一定能成為您想要的結果。以下是GCC 編譯c法式的辦法及進程解析正文


今朝 Linux 下最經常使用的 C 說話編譯器是 GCC ( GNU Compiler Collection ),它是 GNU 項目中相符 ANSI C 尺度的編譯體系,可以或許編譯用 C 、 C++ 和 Object C 等說話編寫的法式。 GCC 不只功效異常壯大,構造也異常靈巧。最值得稱道的一點就是它可以經由過程分歧的前端模塊來支撐各類說話,如Java 、 Fortran 、 Pascal 、 Modula-3 和 Ada 等。開放、自在和靈巧是 Linux 的魅力地點,而這一點在 GCC 上的表現就是法式員經由過程它可以或許更好地掌握全部編譯進程。在應用 GCC 編譯法式時,編譯進程可以被細分為四個階段:

預處置( Pre-Processing )
編譯( Compiling )
匯編( Asse mbling )
鏈接( Linking )
Linux 法式員可以依據本身的須要讓 GCC 在編譯的任何階段停止,以便檢討或應用編譯器在該階段的輸入信息,或許對最初生成的二進制文件停止掌握,以便經由過程參加分歧數目和品種的調試代碼來為往後的調試做好預備。和其它經常使用的編譯器一樣, GCC 也供給了靈巧而壯大的代碼優化功效,應用它可以生成履行效力更高的代碼。
GCC 供給了 30 多條正告信息和三個正告級別,應用它們有助於加強法式的穩固性和可移植性。另外, GCC 還對尺度的 C 和 C++ 說話停止了年夜量的擴大,進步法式的履行效力,有助於編譯器停止代碼優化,可以或許加重編程的任務量。

C 法式的編譯進程重要分為四個階段:pre-processing,compiling,assembling,linking;

經常使用文件的後綴名:

gcc 預處置階段:重要對包括的頭文件(#include )和宏界說(#define,#ifdef … )停止處置。可使用“gcc -E” 讓gcc 在預處置以後停滯編譯進程,生成 *.i 文件。
[root@localhost gcc]# gcc -E hello.c -o hello.i
gcc 編譯階段:gcc 起首要檢討代碼的標准性,能否有語法毛病等。以肯定代碼現實要做的任務,在檢討無誤後,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, 將履行匯編、鏈接進程生成可履行文件a.out, 可以像下面應用-o 選項指定輸入文件的格局。
gcc 鏈接階段:生成可履行文件;可以生成的可履行文件格局有: a.out/*/,固然能夠還有其它格局。
[root@localhost gcc]# gcc hello.o 生成可履行文件 a.out
[root@localhost gcc]# gcc hello.o -o hello 生成可履行文件 hello
gcc 經常使用編譯選項:

-Dmacro 界說指定的宏,使它可以或許經由過程源碼中的 #ifdef 停止磨練;

-O 、 -O2 、 -O3 將優化狀況翻開,該選項不克不及與 -g 選項結合應用;
-v 啟動一切警報,打印編譯進程的信息;
-Wall 在產生警報時撤消編譯操作,行將警報看做是毛病;
-Werror 在產生警報時撤消編譯操作,即把報警看成是毛病;
-w 制止一切的報警。
gcc 鏈接庫文件的應用
在 linux 下開辟軟件時,完整不應用第三方函數庫的情形是比擬少見的,平日來說都須要借助一個或多個函數庫的支撐能力夠完成響應的功效。從法式員的角度看,函數庫現實上就是一些頭文件( .h )和庫文件( .so 或許 .a )的聚集。固然 Linux 下的年夜多半函數都默許將頭文件放到/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 三個字母開首,因為一切的庫文件都遵守了異樣的標准,是以在用-l 選項指定鏈接的庫文件名時可以省去lib 三個字母,也就是說GCC 在對-lfoo 停止處置時,會主動去鏈接名為libfoo.so
Linux 下的庫文件分為兩年夜類分離是靜態鏈接庫(平日以.so 開頭)和靜態鏈接庫(平日以.a 開頭),二者的差異僅在法式履行時所需的代碼是在運轉時靜態加載的,照樣在編譯時靜態加載的 。默許情形下,GCC 在鏈接時優先應用靜態鏈接庫,只要當靜態鏈接庫不存在時才斟酌應用靜態鏈接庫,假如須要的話可以在編譯時加上-static 選項,強迫應用靜態鏈接庫。例如,假如在home/justin/lib/ 目次下有鏈接時所須要的庫文件libfoo.so 和libfoo.a ,為了讓GCC 在鏈接時只用到靜態鏈接庫,可使用上面的敕令:
# gcc foo.c -L /home/justin/lib -static -lfoo -o foo 的文件。
關於靜態庫和靜態庫文件的創立辦法,此處不作具體說明,可以參考別的一篇linux c 庫文件創立辦法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved