GCC 基礎知識


GCC 基礎知識

一、GCC編譯選項解析

1、 常用編譯選項

命令格式:gcc [選項] [文件名]

-E:僅執行編譯預處理;
-S:將C代碼轉換為匯編代碼;
-c:僅執行編譯操作,不進行連接操作;
-o:指定生成的輸出文件。

2、gcc編譯的四個階段(ESc,iso)

1、將hello.c預處理輸出hello.i文件。
gcc -E hello.c -o hello.i

查看hello.i內容如下:

將hello.c預處理輸出hello.i文件

2、將預處理輸出文件hello.i匯編成hello.s文件。
gcc -S hello.i -o hello.s

查看hello.s內容如下:

將預處理輸出文件hello.i匯編成hello.s文件

3、將匯編輸出文件hello.s編譯輸出hello.o文件
gcc -c hello.s -o hello.o

查看hello.o內容如下:
將匯編輸出文件hello.s編譯輸出hello.o文件

4、將編譯輸出文件hello.o鏈接成最終可執行文件hello。

gcc hello.o -o hello

將編譯輸出文件hello.o鏈接成最終可執行文件hello

或直接輸入下面代碼一步到位

gcc hello.c -o hello

當有多個文件需一起編譯時,可輸入

gcc *.c -o hello

二、多模塊、多個文件一起編譯

1、兩種編譯方法

①、一起編譯
gcc test_a.c test_b.c -o test
②、分別編譯各個源文件,之后對編譯后輸出的目標文件鏈接
gcc -c test_a.c  //生成test_a.o
gcc -c test_b.c  //生成test_b.o
gcc -o test_a.o test_b.o -o test

比較:第一種方法編譯時需要所有文件重新編譯;第二種只重新編譯修改的文件,未修改的不用重新編譯。

一個實例:-I參數的使用

使用vim編輯生成相應代碼,注意:.h文件應放入include中, .c文件應放入src中

編譯時若輸入gcc *.c會出現下圖錯誤

應輸入gcc -I/頭文件所在路徑 *.c才能夠成功編譯

這里我們為之后做題方便,可以輸入gcc -I/頭文件所在路徑 *.c -o main將執行文件命名為main。

-I參數可以用相對路徑,比如頭文件在當前目錄,可以用-I.來指定。

三、靜態庫與動態庫

1、靜態函數庫

這類庫的名字一般是libxxx.a;利用靜態函數庫編譯成的文件比較大,因為整個 函數庫的所有數據都會被整合進目標代碼中,他的優點就顯而易見了,即編譯后的執行程序不需要外部的函數庫支持,因為所有使用的函數都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜態函數庫改變了,那么你的程序必須重新編譯。

2、動態函數庫

這類庫的名字一般是libxxx.so;相對於靜態函數庫,動態函數庫在編譯的時候 並沒有被編譯進目標代碼中,你的程序執行到相關函數時才調用該函數庫里的相應函數,因此動態函數庫所產生的可執行文件比較小。由於函數庫沒有被整合進你的程序,而是程序運行時動態的申請並調用,所以程序的運行環境中必須提供相應的庫。動態函數庫的改變並不影響你的程序,所以動態函數庫的升級比較方便。

例子
在上一個實例中有五個.c文件,除了main.c外,其他4個模塊(add.c sub.c mul.c div.c)的源代碼不想給別人,如何制作成一個靜態庫libmath.a和一個共享庫libmath.so,制作完成后如何調用?

我們先來看看靜態庫libmath.a的制作:

1.輸入gcc -c -I/頭文件所在路徑 add.c sub.c mul.c div.c生成四個.o文件。
2.輸入ar rcvs libmath.a add.o sub.o mul.o div.o生成靜態庫。

3.如果之前已經生成了main,我們可以輸入rm main來刪掉它,ls一下可以看到沒有執行文件了。

再輸入gcc main.c -o main -I/頭文件所在路徑 -L. -lmath,可以看到生成了執行文件main,輸入./main就可以實現調用靜態庫來執行文件了!

這里要注意,gcc會在靜態庫名前加上前綴lib,然后追加擴展名.a得到的靜態庫文件名來查找靜態庫文件。那么為什么要在math之前加-l呢?這是因為-l參數就是用來指定程序要鏈接的庫,-l參數緊接着就是庫名。而-L參數跟着的是庫文件所在的目錄名。題中的庫文件在當前目錄,故寫為-L.

我們再來看看動態庫libmath.so的制作:

1.輸入gcc -fPIC -c -I/頭文件所在路徑 add.c sub.c mul.c div.c
2.輸入gcc -shared -o libmath.so add.o sub.o mul.o div.o生成動態庫。

3.我們來輸入gcc -I/頭文件所在路徑 -o main main.c -L. -lmath后執行一下main試一試,會發現出現下圖的錯誤。

這是為什么呢?原來是找不到動態庫文件libmath.so。程序在運行時,會在/usr/lib和/lib等目錄中查找需要的動態庫文件。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程序運行。我們將文件libmath.so復制到目錄/usr/lib中,再試試就可以執行啦!

四、查看幫助文檔

通過man gcc查看關於gcc的幫助文檔。

本文參考鏈接:原作者寫的更好,我這里復制過來只是方便自己查看


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM