C++程序的實現(預處理,編譯,連接)
Linux平台編譯
gcc和g++都是GNU的編譯器。
1、對於.c后綴的文件,gcc把它當做是C程序;g++當做是C++程序;
2、對於.cpp后綴的文件,gcc和g++都會當做c++程序。
3、使用g++編譯文件時,g++會自動鏈接標准庫STL,而gcc不會自動鏈接STL。
test.cpp
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 cout<<"hello world!"<<endl; 6 return 0; 7 }
[zsj@localhost aa]$ ldd test linux-vdso.so.1 => (0x00007ffff64ac000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003a67000000) libm.so.6 => /lib64/libm.so.6 (0x0000003a5b000000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003a66000000) libc.so.6 => /lib64/libc.so.6 (0x0000003a5a400000) /lib64/ld-linux-x86-64.so.2 (0x0000003a59c00000)
gcc/g++ 在執行編譯時,需要4步
1 預處理,生成.i的文件[使用-E參數]
2 將預處理后的文件不轉換成匯編語言,生成文件.s[使用-S參數]
3 有匯編變為目標代碼(機器代碼)生成.o的文件[使用-c參數]
4 連接目標代碼,生成可執行程序[使用-o參數]
4 連接目標代碼,生成可執行程序[使用-o參數]
[zsj@localhost aa]$ g++ -E test.cpp >> test.i [zsj@localhost aa]$ g++ -S test.i >> test.s [zsj@localhost aa]$ g++ -c test.s >>test.o [zsj@localhost aa]$ g++ test.o -o test [zsj@localhost aa]$ ls test test.cpp test.i test.o test.s [zsj@localhost aa]$ ./test hello world!
注意:如果用gcc編譯C++源文件時,加選項:-lstdc++,否則使用了C++操作的文件編譯會出錯
[zsj@localhost aa]$ gcc test.cpp -o test /tmp/cceNJsOV.o: In function `main': test.cpp:(.text+0xa): undefined reference to `std::cout' test.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' test.cpp:(.text+0x14): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' test.cpp:(.text+0x1c): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))' /tmp/cceNJsOV.o: In function `__static_initialization_and_destruction_0(int, int)': test.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()' test.cpp:(.text+0x4f): undefined reference to `std::ios_base::Init::~Init()' /tmp/cceNJsOV.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0' collect2: ld 返回 1 [zsj@localhost aa]$ gcc -lstdc++ test.cpp -o test [zsj@localhost aa]$ ./test hello world!
g++常用的編譯選項
編譯選項 | 含義 |
-Wall | 顯示所有警告信息(warning all) |
-g | 在編譯的時候,產生調試信息(gdb時用) |
-O0 -O1 -O2 -O3 |
編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為缺省值,-O3優化級別最高 |
-Idir | 在你是用#include"file"的時候,gcc/g++會先在當前目錄查找你所指定的頭文件,如 果沒有找到,他回到缺省的頭文件目錄找,如果使用-I制定了目錄,他 會先在你所指定的目錄查找,然后再按常規的順序去找。 |
-Ldir | 指定編譯的時候,搜索庫的路徑。比如你自己的庫,能用他指定目錄,不然 編譯器將只在標准庫的目錄找。這個dir就是目錄的名稱。 |
-llibrary | 指定編譯的時候使用的庫 |
-o | 指定目標名稱,缺省的時候,gcc 編譯出來的文件是a.out |
-fPIC | 作用於編譯階段,告訴編譯器產生與位置無關代碼(Position-Independent Code), 通常和-shared一起,用來編譯動態鏈接庫。 g++ -shared -fPIC -o test.so test.cpp |
-D
|
定義宏,例如-DAAA=1,-DBBBB 等價於 #define AAA 1 |
-U |
取消宏定義,例如-UAAA |
gdb
命令 | 命令縮寫 | 命令說明 |
list | l | 默認顯示10行內容 list <line-number> 顯示參數行之前和之后的10行 list <line1,line2> line1為顯示起始行,line2為顯示結束行 |
file | f | 裝入需要調試的程序 |
break | b | break <line-number> 指定行處設置斷點 break <function-name> 指定函數前設置斷點 break <line-number> if <conditional expression> 使用表達式設置斷點 break <filename:line-number> break <filename:function-name> 如果程序由很多源文件構成,可以在各個源文件中設置斷點 |
info | i | info break 顯示當前斷點信息 info registers 查看寄存器情況 info locals 查看局部變量 |
run | r | 開始運行程序 run <arg1 arg2...> 使用帶參數run后,如果再次使用不帶參數run,gdb就再次使用前一條run命令的參數,如果修改參數,使用set args命令 使用show args命令可以查看缺省參數列表 |
start | st | 開始執行程序,在main函數的第一條語句前面停下來 |
kill | k | 終止正在調試的程序 |
display | disp | 跟蹤查看某個變量,每次停下來都顯示它的值 |
step | s | 執行下一條語句,如果該語句為函數調用,則進入函數執行其中的第一條語句 |
next | n | 執行下一條語句,如果該語句為函數調用,不會進入函數內部執行(即不會一步步地調試函數內部語句) |
continue | c | 繼續程序的運行,直到遇到下一個斷點 |
p | 打印內部變量值print <file::varable-name> print <function::varable-name> 觀察全局變量值 print func(argq,arg2,...) 對程序中的函數進行調試 print <expression> 查看表達式的值 print <array-name>查看數組的值 print <第一個內存地址的值@需要查看的內存長度> eg int *array=(int*) malloc(len*sizeof(int));p *array@len 查看連續內存地址值 變量輸出格式 p/a i 按照16進制顯示變量i的值 p/c i 按照字符格式顯示變量i的值 p/f i按照浮點數的格式顯示變量的值 p/t i 按照二進制顯示變量i的值 |
|
watch | watch <condition> 在程序中設置一個觀察點,condition是觸發觀察點的條件 | |
set | set varname=v 設置變量的值 show convenience查看當前設置的所有環境變量 | |
backtrace | bt | 產看函數調用信息(堆棧) |
frame | f | 查看棧幀 |
singal | singal signum 在某處產生一個信號(具體用法后續整理) |
core文件設置
ulimit -c unlimited
gdb test core