目錄
1、環(huán)境搭建
1.1 編譯器 GCC,調(diào)試器 GDB
1.2 CMake
2、G++ 編譯
2.1 編譯過程
編譯預(yù)處理 *.i
編譯 *.s
匯編 *.o
鏈接 bin
2.2 G++ 參數(shù)
-g
-O[n]
-l、-L
-I
-Wall、-w
-o
-D
-fpic
3、GDB 調(diào)試器
3.1 調(diào)試命令參數(shù)
4、CMake
4.1 含義
4.2 構(gòu)建樹
4.3 常用命令
4.4 構(gòu)建流程
1、環(huán)境搭建
1.1 編譯器 GCC,調(diào)試器 GDB
sudo apt update # 需要更新
sudo apt install build-essential gdb
# 確定版本號
gcc --version
g++ --version
gdb --version
1.2 CMake
sudo apt install cmake
cmake --version
2、G++ 編譯
2.1 編譯過程
編譯預(yù)處理 *.i
-
主要對包含的**頭文件(#include)和宏定義(#define, #ifdef ...)還有注釋**等進行處理;
-
預(yù)處理之后停止編譯過程,生成 *.ii(.c 生成的是 .i)文件;
-
#include 引入的內(nèi)容被全部復(fù)制到預(yù)編譯文件中,宏定義也會被相應(yīng)替換處理。
# -E 僅對源文件進行預(yù)處理 g++ -E test.cpp -o test.i
- 最主要的工作:宏命令的替換;
- #include 單純導(dǎo)入,可以導(dǎo)入 cpp、txt 文件等等;
編譯 *.s
-
語法錯誤檢查,檢查無誤再翻譯成匯編語言;
-
生成的是和 CPU 架構(gòu)相關(guān)的匯編指令,不同 CPU 架構(gòu)采用的匯編指令集不同,生成的匯編代碼也不一樣。
# -S 產(chǎn)生匯編語言文件后停止編譯 g++ -S test.i -o test.s
匯編 *.o
-
g++ 生成:g++ -c test.s -o test.o
-
匯編器匯編生成:as test.s -o test.o
-
將匯編代碼生成機器可執(zhí)行的二進制目標(biāo)代碼。
# -c 僅把源代碼編譯為機器語言的目標(biāo)代碼 g++ -c test.s -o test.o
鏈接 bin
-
核心工作:解決模塊間各種符號(變量、函數(shù))相互引用的問題,除了使用 test.o 還會將靜態(tài)(動態(tài))庫鏈接一同生成可執(zhí)行文件;
-
符號重定位:引用符號(對符號在內(nèi)存中具體地址的引用),解決當(dāng)前編譯單元如何訪問外部符號的問題。
# -o 產(chǎn)生指定文件名的可執(zhí)行文件 g++ test.o -o test # g++ test.o test.so test.a
添加 **g++ --save-temps **參數(shù),保存編譯過程中生成的所有中間文件。
2.2 G++ 參數(shù)
-g
-
編譯帶調(diào)試信息的可執(zhí)行文件;
-
產(chǎn)生能被 GNU 調(diào)試器GDB使用的調(diào)試信息,以調(diào)試程序。
-O[n]
-
優(yōu)化,例如省略從未使用過的變量、直接將常量表達式用結(jié)果值代替等等;
-
-O 對源代碼進行基本優(yōu)化,如-O2,-O3,-On(n 常為0–3) :
-
-O 減小代碼的長度和執(zhí)行時間,等價 -O1;
-
-O0 不做優(yōu)化;
-
-O1 默認優(yōu)化;
-
-O2 完成-O1優(yōu)化之外,還進行一些額外的調(diào)整工作,如指令調(diào)整等;
-
-O3 包括循環(huán)展開和其他一些與處理特性相關(guān)的優(yōu)化工作。
-
-l、-L
-
-l : 指定庫文件,如 -lglog ;
-
-L : 指定庫文件路徑,如 -L/home/lib 。
-I
- 指定頭文件搜索路徑。
-Wall、-w
-
-Wall :打印警告信息;
-
-w :關(guān)閉警告信息。
-o
- 指定輸出文件名,如 -o test 。
-D
- 定義預(yù)處理宏:-DDEBUG 開啟或關(guān)閉 DEBUG。
-fpic
-
position-independent code,是否創(chuàng)建與位置無關(guān)的目標(biāo)(可行性文件或共享庫);
-
PIC廣泛使用于共享庫,使得同一個庫中的代碼能夠被加載到不同進程的地址空間中。PIC 還用于缺少內(nèi)存管理單元的計算機系統(tǒng)中,使得操作系統(tǒng)能夠在單一的地址空間中將不同的運行程序隔離開來;
-
地址無關(guān)代碼能夠在不做修改的情況下被復(fù)制到內(nèi)存中的任意位置。這一點不同于重定位代碼,因為重定位代碼需要經(jīng)過鏈接器或加載器的特殊處理才能確定合適的運行時內(nèi)存地址;
-
cmake: set(CMAKE_POSITION_INDEPENDENT_CODEON)。
3、GDB 調(diào)試器
3.1 調(diào)試命令參數(shù)
$(gdb)help(h) # 查看命令幫助,具體命令查詢在gdb中輸入help + 命令
$(gdb)run(r) # 重新開始運行文件(run-text:加載文本文件,run-bin:加載二進制文件)
$(gdb)start # 單步執(zhí)行,運行程序,停在第一行執(zhí)行語句
$(gdb)next(n) # 單步調(diào)試(逐過程,函數(shù)直接執(zhí)行)
$(gdb)step(s) # 單步調(diào)試(逐語句:跳入自定義函數(shù)內(nèi)部執(zhí)行)
$(gdb)continue(c) # 繼續(xù)運行
$(gdb)finish # 結(jié)束當(dāng)前函數(shù),返回到函數(shù)調(diào)用點
$(gdb)quit(q) # 退出gdb
$(gdb)list(l) # 查看原代碼(list-n,從第n行開始查看代碼。list+ 函數(shù)名:查看具體函數(shù))
$(gdb)backtrace(bt) # 查看函數(shù)的調(diào)用的棧幀和層級關(guān)系
$(gdb)info(i) # 查看函數(shù)內(nèi)部局部變量的數(shù)值
$(gdb)set # 設(shè)置變量的值
$(gdb)display # 追蹤查看具體變量值
$(gdb)print(p) # 打印值及地址
$(gdb)undisplay # 取消追蹤觀察變量
$(gdb)watch # 被設(shè)置觀察點的變量發(fā)生修改時,打印顯示
$(gdb)i watch # 顯示觀察點
$(gdb)info breakpoints # 查看當(dāng)前設(shè)置的所有斷點
$(gdb)enable breakpoints # 啟用斷點
$(gdb)disable breakpoints # 禁用斷點
$(gdb)break+num(b) # 在第num行設(shè)置斷點
$(gdb)delete breakpoints num(d) # 刪除第num個斷點
$(gdb)x # 查看內(nèi)存x/20xw 顯示20個單元,16進制,4字節(jié)每單元
$(gdb)run argv[1] argv[2] # 調(diào)試時命令行傳參
$(gdb)frame(f) # 切換函數(shù)的棧幀
$(gdb)set follow-fork-mode child # Makefile項目管理:選擇跟蹤父子進程(fork())
4、CMake
CMake 始于 1999 年,當(dāng)時開發(fā)公司 Kitware 被委托設(shè)計一套工具來簡化研究人員的日常工作軟件。目標(biāo)很明確:提供一組工具,可以在不同平臺上配置、構(gòu)建、測試和部署項目。
4.1 含義
CMake 本身是一個工具集,由五個可執(zhí)行的程序組成:cmake、ctest、cpack、cmake-gui、ccmake。
-
cmake:用于在構(gòu)建項目的第一步,進行項目的配置、生成和構(gòu)建項目的主要可執(zhí)行文件的工作;
-
ctest:定義測試、測試套件,并設(shè)置應(yīng)該如何執(zhí)行,用于運行和報告測試結(jié)果的測試驅(qū)動程序;
-
cpack:為打包需求提供了 DSL,用來生成安裝程序和源包的打包程序;
-
cmake-gui:cmake 的圖形界面;
-
ccmake:用于圖形界面,與 cmake-gui 不同的地方在于ccmake是基于控制臺(terminal)的圖形界面。
CDash 將項目的測試結(jié)果在面板中展示。
-
CMake time,CMake 運行階段,將處理項目中的 CMakeLists.txt 文件并進行配置;
-
Generation time,配置成功后,CMake 將生成本地構(gòu)建工具所需的腳本,以執(zhí)行項目中的后續(xù)步驟;
-
Build time,調(diào)用編譯器,并在特定的構(gòu)建目錄中構(gòu)建目標(biāo)。遞歸的 CMake time 用來實現(xiàn)平臺無關(guān)的構(gòu)建;
-
CTest time,運行項目的測試套件,以檢查目標(biāo)是否按預(yù)期執(zhí)行。
-
CDash time 或 report time,將測試結(jié)果上傳到面板;
-
Install time,將項目的目標(biāo)、源文件、可執(zhí)行文件和庫從構(gòu)建目錄安裝到安裝位置。
-
CPack time 或 packaging time,項目打包;
-
Package install time,在系統(tǒng)范圍內(nèi)安裝新生成的包。
4.2 構(gòu)建樹
構(gòu)建的每一個目標(biāo),都是樹形的結(jié)構(gòu)。
4.3 常用命令
- cmake_minimum_required - 指定CMake的最小版本要求
語法: cmake_minimum_required(VERSION versionNumber [FATAL_ERROR]
- project - 定義工程名稱,并可指定工程支持的語言
語法: project(projectname [CXX] [C] [Java])
- set - 顯式的定義變量
語法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
set(SRC sayhello.cpp hello.cpp)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set( CMAKE_BUILD_TYPE Debug )
- include_directories - 向工程添加多個特定的頭文件搜索路徑
語法: include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
include_directories(/usr/include/myincludefolder ./include)
- link_directories - 向工程添加多個特定的庫文件搜索路徑
語法: link_directories(dir1 dir2 ...)
link_directories(/usr/lib/mylibfolder ./lib)
- add_library - 生成庫文件
語法: add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
add_library(hello SHARED ${SRC})
- add_compile_options - 添加編譯參數(shù)
語法:add_compile_options
add_compile_options(-Wall -std=c++11 -O2)
- add_executable - 生成可執(zhí)行文件
語法:add_executable(exename source1 source2 ... sourceN)
- target_link_libraries - 為 target 添加需要鏈接的共享庫
語法: target_link_libraries(target library1<debug | optimized> library2...)
- add_subdirectory - 向當(dāng)前工程添加存放源文件的子目錄,并可以指定中間二進制和目標(biāo)二進制存放的位置
語法: add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
- aux_source_directory - 發(fā)現(xiàn)目錄下所有源文件并將列表存儲在一個變量中,被用來自動構(gòu)建源文件列表
語法: aux_source_directory(dir VARIABLE)
-
target_include_directories( swap_lib PUBLIC ${PROJECT_SOURCE_DIR}/include ) - 鏈接靜態(tài)庫目錄
4.4 構(gòu)建流程
-
建立 build 文件夾,并進入 build 目錄:mkdir build & cd build
-
編譯上級目錄的 CMakeLists.txt 文件,生成 Makefile 和 其他文件:cmake ..
-
執(zhí)行 make 命令,生成目標(biāo):make
-
流程圖如下,包括三個基本階段:配置、生成、構(gòu)建階段:文章來源:http://www.zghlxwxcb.cn/news/detail-425219.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-425219.html
到了這里,關(guān)于CMake : Linux 搭建開發(fā) - g++、gdb的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!