***gcc是C編譯器;
***g++是C++編譯器;
***linux下cc一般是一個符號連接,指向gcc
***gcc說明
1.gcc編譯常用格式:
??? gcc? C源文件 -o 目標文件
或
??? gcc -o 目標文件? C源文件
或
??? gcc C源文件
最后一種情況產生的目標文件默認為a.out
2.gcc總體參數
-c? 只是編譯不鏈接,生成目標文件
-S? 只是編譯不匯編,生成匯編代碼
-E? 只進行預編譯
-g 在可執行文件中包含調試信息(與下一篇的必須命令)
-o file 把輸出文件輸出到file中
-v 顯示gcc的版本信息
-I dir 在頭文件的搜索路徑中添加dir目錄
-L dir 在庫文件的路徑列表中添加dir目錄
-static 鏈接靜態庫
-library 連接名問library的庫文件
3.gcc生成庫流程
gcc指令的一般格式如下:
gcc [參數] 要編譯的文件 [參數]? [目標文件]
gcc編譯流程:
源代碼(.c)->預處理(Pre-Processing)->編譯(Compiling)->匯編(Assembing)->鏈接(Linking)->可執行文件
具體命令如下:
c文件用gcc的"-E"參數預處理,生成預處理“.i”文件,用gcc的“-S”參數編譯,生成匯編“.s"文件,再用gcc的”-c“參數匯編,生成二進制”.o“文件,最后再用一次gcc把”.o“文件和一些鏈接庫文件鏈接成可執行文件。
我們用gcc編譯程序時,可能會用到“-I”(大寫i),“-L”(大寫l),“-l”(小寫l)等參數,下面做個記錄:
?
例:
gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib
多個文件合并創造一個程序時,就要再-o后,寫上多個文件的文件名
例:
?gcc -o json cJSON.c test.c
GCC?命令行詳解?-L?指定庫的路徑?-l?指定需連接的庫名
gcc,cc,c++,g++,gcc和cc是一樣的,c++和g++是一樣的,(沒有看太明白前面這半句是什
么意思:))一般c程序就用gcc編譯,c++程序就用g++編譯
2。gcc的基本用法
gcc?test.c這樣將編譯出一個名為a.out的程序
gcc?test.c?-o test這樣將編譯出一個名為test的程序,-o參數用來指定生成程序的名
字
3。為什么會出現undefined reference to 'xxxxx'錯誤?
首先這是鏈接錯誤,不是編譯錯誤,也就是說如果只有這個錯誤,說明你的程序源碼本
身沒有問題,是你用編譯器編譯時參數用得不對,你沒
有指定鏈接程序要用到得庫,比如你的程序里用到了一些數學函數,那么你就要在編譯
參數里指定程序要鏈接數學庫,方法是在編譯命令行里加入-lm。
4。-l參數和-L參數
-l參數就是用來指定程序要鏈接的庫,-l參數緊接著就是庫名,那么庫名跟真正的庫文
件名有什么關系呢?
就拿數學庫來說,他的庫名是m,他的庫文件名是libm.so,很容易看出,把庫文件名的
頭lib和尾.so去掉就是庫名了。
好了現在我們知道怎么得到庫名了,比如我們自已要用到一個第三方提供的庫名字叫lib
test.so,那么我們只要把libtest.so拷貝到/usr/lib
里,編譯時加上-ltest參數,我們就能用上libtest.so庫了(當然要用libtest.so庫里
的函數,我們還需要與libtest.so配套的頭文件)。
放在/lib和/usr/lib和/usr/local/lib里的庫直接用-l參數就能鏈接了,但如果庫文件
沒放在這三個目錄里,而是放在其他目錄里,這時我們
?