C/C++ 編譯器知識總結


@

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 編譯過程

  1. 預處理 (pre-Processing):生成 .i 文件
	# -E 選項指示編譯器僅對輸入文件進行預處理
	g++ -E test.cpp -o test.i //.i文件
  1. 編譯 (Compling):生成 .s 文件
	# -S 編譯選項告訴 g++ 在為 C++ 代碼產生了匯編語言文件后停止編譯
	# g++ 產生的匯編語言文件的缺省擴展名是 .s
	g++ -S test.i -o test.s
  1. 匯編(Assembing):生成 .o文件
	# -c 選項告訴 g++ 僅把源代碼編譯為機器語言的目標代碼
	# 缺省時 g++ 建立的目標代碼文件有一個 .o 的擴展名。
	g++ -c test.s -o test.o
  1. 連接 (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


免責聲明!

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



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