C語(yǔ)言編程C++編輯器及調(diào)試工具操作命令詳解
一、GCC編譯器
1、GNU工具
編譯工具:把一個(gè)源程序編譯成為一個(gè)可執(zhí)行程序。
調(diào)試工具:能對(duì)執(zhí)行程序進(jìn)行源碼及匯編級(jí)調(diào)試。
軟件工程工具:用于協(xié)助多人開發(fā)或大型軟件項(xiàng)目的管理,如make、CVS、Subvision
其他工具:用于把多個(gè)目標(biāo)文件鏈接成可執(zhí)行文件的鏈接器,或者用作格式轉(zhuǎn)換的工具。
2、GCC簡(jiǎn)介
全稱為GNU CC ,GNU項(xiàng)目中符合ANSI C標(biāo)準(zhǔn)的的編譯系統(tǒng)。
編譯如C、C++、Object C 、Java、Fortran 、Pascal、Modula-3和Ada等多種語(yǔ)言。
GCC是可以在多種硬件平臺(tái)上編譯出可執(zhí)行程序的超級(jí)編譯器,其執(zhí)行效率與一般的編譯器相比平均效率要高20%~30%。
一個(gè)交叉平臺(tái)編譯器,適合在嵌入式領(lǐng)域的開發(fā)編譯
3、GCC編譯器的版本
GNU Compiler Collection
C、C++、Objective-C、Fortran,Java、Ada
http://gcc.gnu.org
4、gcc所支持后綴名解釋
.c
----- C原始程序
.C/.cc/.cxx
----- C++原始程序
.m
----- Objective-C原始程序
.i
----- 已經(jīng)預(yù)處理過(guò)的 C原始程序
.ii
----- 已經(jīng)預(yù)處理過(guò)的C++原始程序
.s/.S
----- 匯編語(yǔ)言原始程序
.h
----- 預(yù)處理文件(頭文件)
.o
----- 目標(biāo)文件
.a/.so
----- 編譯后的庫(kù)文件
5、編譯器的主要組件
分析器:分析器將源語(yǔ)言程序代碼轉(zhuǎn)換成匯編語(yǔ)言。因?yàn)橐獜囊环N格式轉(zhuǎn)換成為另一種格式(C到匯編),所以分析器需要知道目標(biāo)機(jī)器的匯編語(yǔ)言。
匯編器:匯編器將匯編語(yǔ)言代碼轉(zhuǎn)換成為CPU可以執(zhí)行字節(jié)碼。
鏈接器:鏈接器將匯編器生成的單獨(dú)的目標(biāo)文件組合成可執(zhí)行的應(yīng)用程序。鏈接器需要知道這種目標(biāo)格式以便工作。
標(biāo)準(zhǔn)C庫(kù):核心的C函數(shù)都有一個(gè)主要的C庫(kù)來(lái)提供。如果在應(yīng)用程序中用到了C庫(kù)中的函數(shù),這個(gè)庫(kù)就會(huì)通過(guò)鏈接器和源代碼連接來(lái)生成最終的可執(zhí)行程序。
6、GCC的基本用法和選項(xiàng)
Gcc最基本的用法:gcc [options ] [filenames]
-c
, 只編譯,不連接成為可執(zhí)行文件,編譯器只是由輸入的.c等源文件生成.o為后綴的目標(biāo)文件,通常用于編譯不包含主程序的子程序文件。
-o
output filename, 確定輸出文件的名稱為output filename,同時(shí)這個(gè)名稱不能和源文件同名。如果不給出這個(gè)選項(xiàng),gcc就給出預(yù)設(shè)的可執(zhí)行文件a.out
-g
,產(chǎn)生符號(hào)調(diào)試工具(GNU的gdb)所必要的符號(hào)資訊,要想對(duì)源代碼進(jìn)行調(diào)試,我們就必須加入這個(gè)選項(xiàng)。
-0
,對(duì)程序進(jìn)行 優(yōu)化編譯、連接、采用這個(gè)選項(xiàng),整個(gè)源代碼會(huì)在編譯、連接過(guò)程中進(jìn)行優(yōu)化處理,這樣產(chǎn)生的可執(zhí)行文件的執(zhí)行效率更高,但是,編譯、連接的速度就會(huì)相應(yīng)的更慢一些。
-02
,比-0更好的優(yōu)化編譯、連接,當(dāng)然整個(gè)編譯、連接過(guò)程會(huì)更慢。
-l
dirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是在預(yù)編譯過(guò)程中使用的參數(shù)。
-L
dirname,將dirname所指出的目錄加入到程序函數(shù)檔案庫(kù)文件的目錄列表中,是在鏈接過(guò)程中使用的參數(shù)。
7、GCC的錯(cuò)誤類型及對(duì)策
8、GCC編譯過(guò)程
1、預(yù)處理:處理以 " # " 開頭的語(yǔ)句,生成后綴名為 “ .i ” 的文件。
gcc -E test.c -o test -Wall -lm
2、編譯:根據(jù)不同的處理器把 “ *.i ”文件生成 “ *.s ” 匯編文件。
gcc -S test.i -o test.s
3.匯編處理: 匯編代碼并不是電腦能夠直接識(shí)別的,要經(jīng)過(guò)匯編器的處理生成“ *.o ”的目標(biāo)文件,可以用file命令查看文件信息。
gcc -c test.s -o test.o
4、鏈接: 多個(gè) “*.c ” 文件就會(huì)生成多個(gè) “ *.o ” 文件,就需要用鏈接器將每個(gè) “ *.o ”文件鏈接起來(lái),標(biāo)準(zhǔn)的C庫(kù)是默認(rèn)自動(dòng)鏈接的 。
gcc test.o -o test -lm
#include <stdio.h> #include <math.h> #define N 10 #define _DEBUG_ int main(int argc,const char *argv[]) { double m = 615,n; m += N ; n = sqrt(m); #ifdef _DEBUG_ printf("debug:m=%lf n=%lf \n",m,n); #else printf("release:m=%lf n=%lf \n",m,n); #endif return 0; }
條件編譯
1、 根據(jù)宏是否定義
#ifdef …#else … #endif
2、根據(jù)宏定義的值
#define DEFINE 1
#if DEFINE …#else … #endif
二、GDB調(diào)試工具
1、Gdb調(diào)試流程:
首先使用gcc對(duì) *.c 文件進(jìn)行編譯,注意一定要加上選項(xiàng) -g
1、gcc -g **.c -o **
2、gdb gcc
2、進(jìn)入代碼調(diào)試模式后
(gdb)l ---- 查看文件
(gdb) b 6 ---- 設(shè)置斷點(diǎn)
(gdb)del 1 ---- 刪除第一個(gè)斷點(diǎn)
(gdb)info b ---- 查看斷點(diǎn)情況
(gdb)r ---- 運(yùn)行代碼
(gdb) p n ---- 查看變量值
(gdb) n (gdb) s ---- 單步運(yùn)行 n :運(yùn)行主程序時(shí)不進(jìn)去子函數(shù),s :運(yùn)行主函數(shù)時(shí)進(jìn)入子函數(shù)
(gdb) c ---- 恢復(fù)程序運(yùn)行 ------- 直接運(yùn)行到下一個(gè)斷點(diǎn)
(gdb) help [command] ---- 幫助
(gdb)q -----退出
(gdb)set args -----調(diào)命令行參數(shù)用的
以上就是C語(yǔ)言編程C++編輯調(diào)試工具操作命令詳解的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言編程C++編輯調(diào)試工具的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
opencv實(shí)現(xiàn)機(jī)器視覺檢測(cè)和計(jì)數(shù)的方法
在機(jī)器視覺中,有時(shí)需要對(duì)產(chǎn)品進(jìn)行檢測(cè)和計(jì)數(shù)。其難點(diǎn)無(wú)非是對(duì)于產(chǎn)品的圖像分割。本文就來(lái)介紹一下機(jī)器視覺檢測(cè)和計(jì)數(shù)的實(shí)現(xiàn),感興趣的可以參考一下2021-05-05深入探討linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文件數(shù)
本篇文章是對(duì)linux下進(jìn)程的最大線程數(shù)、進(jìn)程最大數(shù)、進(jìn)程打開的文件數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05基于MFC和OpenCV實(shí)現(xiàn)角點(diǎn)檢測(cè)
這篇文章主要為大家詳細(xì)介紹了基于MFC和OpenCV實(shí)現(xiàn)角點(diǎn)檢測(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03基于Qt實(shí)現(xiàn)駕??颇靠荚囅到y(tǒng)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何基于Qt實(shí)現(xiàn)駕校科目考試系統(tǒng),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定幫助,需要的可以參考一下2022-07-07C/C++實(shí)現(xiàn)日期計(jì)算器的示例代碼
本篇文章主要介紹了C/C++實(shí)現(xiàn)日期計(jì)算器的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09解析Linux下的時(shí)間函數(shù):設(shè)置以及獲取時(shí)間的方法
本篇文章是對(duì)Linux下的時(shí)間函數(shù):設(shè)置以及獲取時(shí)間的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++實(shí)現(xiàn)大整數(shù)乘法(字符串乘法)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)大整數(shù)乘法、字符串乘法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09