g++ test.cpp main.cpp main
生存可以執行的main
g++ -c -fPIC -o test.o test.cpp
生成目標文件test.o(注意這裡是目標文件不是可執行文件)
g++ -shared -o libCompute.so test.o
生成 SO共享庫
g++ main.cpp -L. -lCompute -o somain
調用動態庫 -L表示動態庫的查找路徑
-ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱 這裡表示動態庫的名字為 -lCompute 就表示 -libCompute.so
一. 常用編譯命令選項
假設源程序文件名為test.c。
1. 無選項編譯鏈接
用法:#gcc test.c
作用:將test.c預處理、匯編、編譯並鏈接形成可執行文件。這裡未指定輸出文件,默認輸出為a.out。
2. 選項 -o
用法:#gcc test.c -o test
作用:將test.c預處理、匯編、編譯並鏈接形成可執行文件test。-o選項用來指定輸出文件的文件名。
3. 選項 -E
用法:#gcc -E test.c -o test.i
作用:將test.c預處理輸出test.i文件。
4. 選項 -S
用法:#gcc -S test.i
作用:將預處理輸出文件test.i匯編成test.s文件。
5. 選項 -c
用法:#gcc -c test.s
作用:將匯編輸出文件test.s編譯輸出test.o文件。
6. 無選項鏈接
用法:#gcc test.o -o test
作用:將編譯輸出文件test.o鏈接成最終可執行文件test。
7. 選項-O
用法:#gcc -O1 test.c -o test
作用:使用編譯優化級別1編譯程序。級別為1~3,級別越大優化效果越好,但編譯時間越長。
二. 多源文件的編譯方法
如果有多個源文件,基本上有兩種編譯方法:
[假設有兩個源文件為test.c和testfun.c]
1. 多個文件一起編譯
用法:#gcc testfun.c test.c -o test
作用:將testfun.c和test.c分別編譯後鏈接成test可執行文件。
2. 分別編譯各個源文件,之後對編譯後輸出的目標文件鏈接。
用法:
#gcc -c testfun.c //將testfun.c編譯成testfun.o
#gcc -c test.c //將test.c編譯成test.o
#gcc -o testfun.o test.o -o test //將testfun.o和test.o鏈接成test
以上兩種方法相比較,第一中方法編譯時需要所有文件重新編譯,而第二種方法可以只重新編譯修改的文件,未修改的文件不用重新編譯。
3. 如果要編譯的文件都在同一個目錄下,可以用通配符gcc *.c -o 來進行編譯。
你是否會問,如果是一個項目的話,可能會有上百個文件,這樣的編譯法,人不是要累死在電腦前嗎,或者等到你編譯成功了,豈不是頭發都白了,呵呵,所以我們要把上述的編譯過程寫進以下一個文本文件中:
Linux下稱之為makefile
#這裡可以寫一些文件的說明
MyFirst: MyFirst.o hello.o
g++ MyFirst.o hello.o -o MyFirst
Hello.o:Hello.cpp
g++ -c Hello.cpp -o Hello.o
MyFirst.o:MyFirst.cpp
g++ -c MyFirst.cpp -o MyFirst.o
makefile 編寫規則:
(1)以“#”開始的行為注釋
(2)文件依賴關系為:
target:components
rule
存盤為MyFirst,在終端輸入:make MyFist,程序出現了錯誤可是所有程序員共同的敵人,在編寫程序時我們應該盡量的去避免錯誤的出現,不過編寫的時候再怎麼都不可避免的出現這樣那樣的錯誤,對程序進行必要的調試是一個好主意,那我們怎麼來調試程序呢,看下面:
gdb ./文件名 ////////////////在這裡我修改下要想下面可以調試,在上面編譯的 時候必須加上參數g,g++ -g hello.cpp -o hello
以下為調試狀態下的可以用到的命令(可以僅輸入單詞的輸入,如break可簡為b),尖括號中為說明
list <顯示源代碼>
break 行號 <設置斷點>
run <運行程序>
continue <繼續從斷點處執行>
print 變量 <調試時查看變量的值>
del 行號 <刪除斷點>
step <單步執行,可跟蹤到函數內部>
next <單步執行,不可跟蹤到函數內部>
quit <退出>
makefile 的編寫不是件容易的事情,因為自己寫的makefile可能不能在所有的unix/linux類操作系統下通用。因此在很多項目中都用automake.autoconf或者是Cmake等工具。
GCC 的詳細介紹:請點這裡
GCC 的下載地址:請點這裡