@
目錄
B站視頻地址:https://www.bilibili.com/video/BV1fy4y1b7TC?p=1
1. 編譯器調試安裝
安裝gdb,gcc,g++
yum install gdb
yum install gcc-c++
檢查是否安裝成功
gcc --version
gdb --version
g++ --version
安裝cmake
#安裝wget
yum install -y wget
#獲取CMake源碼包
wget http://www.cmake.org/files/v2.8/cmake-2.8.10.2.tar.gz
#解壓CMake源碼包
tar -zxvf cmake-2.8.10.2.tar.gz
#進入目錄
cd cmake-2.8.10.2
#安裝
./bootstrap
gmake
gmake install
檢查cmake是否安裝成功
cmake --version
2.GCC編譯器
2.1 編譯過程
- 預處理 (pre-Processing):生成 .i 文件
# -E 選項指示編譯器僅對輸入文件進行預處理
g++ -E test.cpp -o test.i //.i文件
- 編譯 (Compling):生成 .s 文件
# -S 編譯選項告訴 g++ 在為 C++ 代碼產生了匯編語言文件后停止編譯
# g++ 產生的匯編語言文件的缺省擴展名是 .s
g++ -S test.i -o test.s
- 匯編(Assembing):生成 .o文件
# -c 選項告訴 g++ 僅把源代碼編譯為機器語言的目標代碼
# 缺省時 g++ 建立的目標代碼文件有一個 .o 的擴展名。
g++ -c test.s -o test.o
- 連接 (Linking) :生成 bin文件
# -o 編譯選項來為將產生的可執行文件用指定的文件名
g++ test.o -o test
2.2 g++重要編譯參數
- -g 編譯帶調試信息的可執行文件
# -g 選項告訴 GCC 產生能被 GNU 調試器GDB使用的調試信息,以調試程序。
# 產生帶調試信息的可執行文件test
g++ -g test.cpp
- -O[n] 優化源代碼
## 所謂優化,例如省略掉代碼中從未使用過的變量、直接將常量表達式用結果值代替等等,這些操作
會縮減目標文件所包含的代碼量,提高最終生成的可執行文件的運行效率。
# -O 選項告訴 g++ 對源代碼進行基本優化。這些優化在大多數情況下都會使程序執行的更快。 -O2
選項告訴 g++ 產生盡可能小和盡可能快的代碼。 如-O2,-O3,-On(n 常為0–3)
# -O 同時減小代碼的長度和執行時間,其效果等價於-O1
# -O0 表示不做優化
# -O1 為默認優化
# -O2 除了完成-O1的優化之外,還進行一些額外的調整工作,如指令調整等。
# -O3 則包括循環展開和其他一些與處理特性相關的優化工作。
# 選項將使編譯的速度比使用 -O 時慢, 但通常產生的代碼執行速度會更快。
# 使用 -O2優化源代碼,並輸出可執行文件
g++ -O2 test.cpp
- -l 和 -L 指定庫文件 | 指定庫文件路徑
# -l參數(小寫)就是用來指定程序要鏈接的庫,-l參數緊接着就是庫名
# 在/lib和/usr/lib和/usr/local/lib里的庫直接用-l參數就能鏈接
# 鏈接glog庫
g++ -lglog test.cpp
# 如果庫文件沒放在上面三個目錄里,需要使用-L參數(大寫)指定庫文件所在目錄
# -L參數跟着的是庫文件所在的目錄名
# 鏈接mytest庫,libmytest.so在/home/bing/mytestlibfolder目錄下
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp
- -I 指定頭文件搜索目錄
# -I
# /usr/include目錄一般是不用指定的,gcc知道去那里找,但 是如果頭文件不在/usr/icnclude
里我們就要用-I參數指定了,比如頭文件放在/myinclude目錄里,那編譯命令行就要加上-
I/myinclude 參數了,如果不加你會得到一個”xxxx.h: No such file or directory”的錯
誤。-I參數可以用相對路徑,比如頭文件在當前 目錄,可以用-I.來指定。上面我們提到的–cflags參
數就是用來生成-I參數的。
g++ -I/myinclude test.cpp
- -Wall 打印警告信息
# 打印出gcc提供的警告信息
g++ -Wall test.cpp
- -w 關閉警告信息
# 關閉所有警告信息
g++ -w test.cpp
- -std=c++11 設置編譯標准
# 使用 c++11 標准編譯 test.cpp
g++ -std=c++11 test.cpp
- -o 指定輸出文件名
# 指定即將產生的文件名
# 指定輸出可執行文件名為test
g++ test.cpp -o test
- -D 定義宏
# 在使用gcc/g++編譯的時候定義宏
# 常用場景:
# -DDEBUG 定義DEBUG宏,可能文件中有DEBUG宏部分的相關信息,用個DDEBUG來選擇開啟或關閉
DEBUG
3.cmake
cmake是一個跨平台的安裝編譯工具,可以使用簡單的語句描述所有平台的安裝(編譯過程)
cmake已經成為大部分C++開源項目的標配
3.1 語法介紹
- 基本語法格式:指令(參數1 參數2)
參數使用括弧括起,參數之間使用空格或者分號隔開。 - 指令是大小寫無關,參數和變量區分大小寫
set(HELLO hello.cpp)
add_executable(hello main.cpp hello.cpp)
ADD_EXECUTABLE(hello main.cpp ${HELLO})
- 變量使用${}方式取值,但是在 IF 控制語句中是直接使用變量名
3.2 重要指令
- cmake_minimum_required : 指定CMake的最小版本要求
語法: cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])
# CMake最小版本要求為2.8.3
cmake_minimum_required(VERSION 2.8.3)
- project :定義工程名稱,並且可指定工程支持的語言
語法: project(projectname [CXX] [C] [Java])
其中[ ]表示可選項
# 指定工程名為HELLOWORLD
project(HELLOWORLD)
- set:顯示的定義變量
語法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
# 定義SRC變量,其值為sayhello.cpp hello.cpp
set(SRC sayhello.cpp hello.cpp)
- include_directories:向工程添加多個特定的頭文件搜索路徑
語法: include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
# 將/usr/include/myincludefolder 和 ./include 添加到頭文件搜索路徑
include_directories(/usr/include/myincludefolder ./include)
- link_directories:向工程添加多個特定的庫文件搜索路徑
語法: link_directories(dir1 dir2 ...)
# 將/usr/lib/mylibfolder 和 ./lib 添加到庫文件搜索路徑
link_directories(/usr/lib/mylibfolder ./lib)
- add_library:生成庫文件
語法: add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
# 通過變量 SRC 生成 libhello.so 共享庫
add_library(hello SHARED ${SRC})
- add_compile_options - 添加編譯參數
語法:add_compile_options( )
# 添加編譯參數 -Wall -std=c++11 -O2
add_compile_options(-Wall -std=c++11 -O2)
- add_executable - 生成可執行文件
語法:add_executable(exename source1 source2 ... sourceN
# 編譯main.cpp生成可執行文件main
add_executable(main main.cpp)
- target_link_libraries - 為 target 添加需要鏈接的共享庫
語法: target_link_libraries(target library1<debug | optimized> library2...)
# 將hello動態庫文件鏈接到可執行文件main
target_link_libraries(main hello)
- add_subdirectory - 向當前工程添加存放源文件的子目錄,並可以指定中間二進制和目標二進制
存放的位置
語法: add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# 添加src子目錄,src中需有一個CMakeLists.txt
add_subdirectory(src)
- aux_source_directory - 發現一個目錄下所有的源代碼文件並將列表存儲在一個變量中,這個指
令臨時被用來自動構建源文件列表
語法: aux_source_directory(dir VARIABLE)
# 定義SRC變量,其值為當前目錄下所有的源代碼文件
aux_source_directory(. SRC)
# 編譯SRC變量所代表的源代碼文件,生成main可執行文件
add_executable(main ${SRC})
3.3 CMake常用變量
- CMAKE_C_FLAGS gcc編譯選項
- CMAKE_CXX_FLAGS g++編譯選項
# 在CMAKE_CXX_FLAGS編譯選項后追加-std=c++11
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- CMAKE_BUILD_TYPE 編譯類型(Debug, Release)
# 設定編譯類型為debug,調試時需要選擇debug
set(CMAKE_BUILD_TYPE Debug)
# 設定編譯類型為release,發布時需要選擇release
set(CMAKE_BUILD_TYPE Release)
- CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
_SOURCE_DIR
1. 這三個變量指代的內容是一致的,不論采用何種編譯方式,都是工程頂層目錄。
2. 也就是在 in source build時,他跟 CMAKE_BINARY_DIR 等變量一致。
3. PROJECT_SOURCE_DIR 跟其他指令稍有區別,現在,你可以理解為他們是一致的
- CMAKE_C_COMPILER:指定C編譯器
- CMAKE_CXX_COMPILER:指定C++編譯器
- EXECUTABLE_OUTPUT_PATH:可執行文件輸出的存放路徑
- LIBRARY_OUTPUT_PATH:庫文件輸出的存放路徑
4.CMake編譯工程
CMake目錄結構:項目主目錄存在一個CMakeLists.txt文件
4.1 編譯流程
在linux平台下使用CMake構建C/C++工程的流程如下:
- 手動編寫CMakeLists.txt文件
- 執行cmake PATH 生成 Makefile ( PATH 是頂層CMakeLists.txt 所在的目錄 )。
- 執行 make 進行編譯
4.2 兩種構建方式
- 內部構建(in-source build):不推薦使用
內部構建會在同級目錄下產生一大堆中間文件,這些中間文件並不是我們最終所需要的,和工程源
文件放在一起會顯得雜亂無章。
## 內部構建
# 在當前目錄下,編譯本目錄的CMakeLists.txt,生成Makefile和其他文件
cmake .
# 執行make命令,生成target
make
- 外部構建(out-of-source build):推薦使用
將編譯輸出文件與源文件放到不同目錄中
## 外部構建
# 1. 在當前目錄下,創建build文件夾
mkdir build
# 2. 進入到build文件夾
cd build
# 3. 編譯上級目錄的CMakeLists.txt,生成Makefile和其他文件
cmake ..
# 4. 執行make命令,生成target
make
5.CMake代碼實踐
- 最小CMake工程
# Set the minimum version of CMake that can be used
cmake_minimum_required(VERSION 3.0)
# Set the project name
project (HELLO)
# Add an executable
add_executable(hello_cmake main.cpp)
- 多目錄工程-直接編譯
# Set the minimum version of CMake that can be used
cmake_minimum_required(VERSION 2.8)
project(CODE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
set(CMAKE_BUILD_TYPE Debug)
include_directories(${CMAKE_SOURCE_DIR}/include)
add_executable(main main.cpp src/Gun.cpp src/Solider.cpp)
- 配置json並調試項目
launch.json
{
// 使用 IntelliSense 了解相關屬性。
// 懸停以查看現有屬性的描述。
// 欲了解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 啟動",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/main",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "為 gdb 啟用整齊打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "Build",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
task.josn
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build" // 進入build文件夾
},
"tasks": [
{
"label": "cmake",
"type": "shell",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"group": {
"kind": "build",
"isDefault": true
},
"command": "make",
"args": [
]
},
{
"label": "Build",
"dependsOrder": "sequence", // 按照列出的順序執行依賴項
"dependsOn":[
"cmake",
"make"
]
}
]
}
6. 安裝cmake3.14
參考:https://blog.csdn.net/llwy1428/article/details/95473542
https://www.cnblogs.com/sunzD/p/13457327.html