C++基礎之C++編譯調試


 
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參數]
 
[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 繼續程序的運行,直到遇到下一個斷點
 print  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 
 


免責聲明!

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



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