開發(fā)環(huán)境搭建
安裝VScode和GCC編譯器。
項(xiàng)目文件夾
一般一個(gè)項(xiàng)目中應(yīng)該包含
include文件夾——用于保存頭文件
src文件夾——用于保存源文件
GCC編譯器
GCC編譯器支持編譯go、c、c++等語(yǔ)言。vscode就是通過(guò)調(diào)用GCC編譯器來(lái)實(shí)現(xiàn)c/c++的編譯工作的。
在使用過(guò)程中,
使用gcc指令編譯c代碼;
使用g++指令編譯c++代碼。
編譯過(guò)程
1.預(yù)處理
在此階段編譯器會(huì)處理以“#”開頭的預(yù)處理指令,如#include、#define 等;
處理后的文件通常會(huì)將頭文件的內(nèi)容替換到 #include 指令所在的位置,并且會(huì)展開 #define 宏定義。
# -E 選項(xiàng)指示編譯器僅對(duì)輸入文件進(jìn)行預(yù)處理
g++ -E test.cpp -o test.i //.i文件
2.編譯
在這個(gè)階段,預(yù)處理后的源代碼被翻譯成匯編代碼。
# -S 編譯選項(xiàng)告訴 g++ 在為 C++ 代碼產(chǎn)生了匯編語(yǔ)言文件后停止編譯
# g++ 產(chǎn)生的匯編語(yǔ)言文件的缺省擴(kuò)展名是 .s
g++ -S test.i -o test.s
3.匯編
匯編器將匯編代碼轉(zhuǎn)換為二進(jìn)制目標(biāo)文件,匯編器將匯編代碼轉(zhuǎn)換為機(jī)器指令,并生成目標(biāo)文件,目標(biāo)文件中包含了機(jī)器指令、符號(hào)表、重定位信息和其他元數(shù)據(jù)。
# -c 選項(xiàng)告訴 g++ 僅把源代碼編譯為機(jī)器語(yǔ)言的目標(biāo)代碼
# 缺省時(shí) g++ 建立的目標(biāo)代碼文件有一個(gè) .o 的擴(kuò)展名。
g++ -c test.s -o test.o
4.鏈接
將所有的目標(biāo)文件以及可能的庫(kù)文件鏈接在一起形成最終的可執(zhí)行文件。鏈接器將各個(gè)目標(biāo)文件中的符號(hào)引用解析為實(shí)際的內(nèi)存地址,并且將程序所需要的庫(kù)文件鏈接到最終的可執(zhí)行文件中。
# -o 編譯選項(xiàng)來(lái)為將產(chǎn)生的可執(zhí)行文件用指定輸出路徑與文件名
g++ test.o -o test
g++的重要編譯參數(shù)
- -g 編譯帶調(diào)試信息的可執(zhí)行文件
# -g 選項(xiàng)告訴 GCC 產(chǎn)生能被 GNU 調(diào)試器GDB使用的調(diào)試信息,以調(diào)試程序。
# 產(chǎn)生帶調(diào)試信息的可執(zhí)行文件test
g++ -g test.cpp
- -O[n] 優(yōu)化源代碼
-O2 較常使用。
## 所謂優(yōu)化,例如省略掉代碼中從未使用過(guò)的變量、直接將常量表達(dá)式用結(jié)果值代替等等,這些操作
會(huì)縮減目標(biāo)文件所包含的代碼量,提高最終生成的可執(zhí)行文件的運(yùn)行效率。
# -O 選項(xiàng)告訴 g++ 對(duì)源代碼進(jìn)行基本優(yōu)化。這些優(yōu)化在大多數(shù)情況下都會(huì)使程序執(zhí)行的更快。 -O2
選項(xiàng)告訴 g++ 產(chǎn)生盡可能小和盡可能快的代碼。 如-O2,-O3,-On(n 常為0–3)
# -O 同時(shí)減小代碼的長(zhǎng)度和執(zhí)行時(shí)間,其效果等價(jià)于-O1
# -O0 表示不做優(yōu)化
# -O1 為默認(rèn)優(yōu)化
# -O2 除了完成-O1的優(yōu)化之外,還進(jìn)行一些額外的調(diào)整工作,如指令調(diào)整等。
# -O3 則包括循環(huán)展開和其他一些與處理特性相關(guān)的優(yōu)化工作。
# 選項(xiàng)將使編譯的速度比使用 -O 時(shí)慢, 但通常產(chǎn)生的代碼執(zhí)行速度會(huì)更快。
# 使用 -O2優(yōu)化源代碼,并輸出可執(zhí)行文件
g++ -O2 test.cpp
- -l|-L 指定庫(kù)文件|庫(kù)文件路徑
# -l參數(shù)(小寫)就是用來(lái)指定程序要鏈接的庫(kù),-l參數(shù)緊接著就是庫(kù)名
# 在/lib和/usr/lib和/usr/local/lib里的庫(kù)直接用-l參數(shù)就能鏈接 LINUX系統(tǒng)下的
# 鏈接glog庫(kù)
g++ -lglog test.cpp
# 如果庫(kù)文件沒(méi)放在上面三個(gè)目錄里,需要使用-L參數(shù)(大寫)指定庫(kù)文件所在目錄
# -L參數(shù)跟著的是庫(kù)文件所在的目錄名
# 鏈接mytest庫(kù),libmytest.so在/home/bing/mytestlibfolder目錄下
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp
- -I 指定頭文件搜索目錄
# -I
# /usr/include目錄一般是不用指定的,gcc知道去那里找,但 是如果頭文件不在/usr/icnclude
里我們就要用-I參數(shù)指定了,比如頭文件放在/myinclude目錄里,那編譯命令行就要加上
I/myinclude 參數(shù)了,如果不加你會(huì)得到一個(gè)”xxxx.h: No such file or directory”的錯(cuò)
誤。-I參數(shù)可以用相對(duì)路徑,比如頭文件在當(dāng)前 目錄,可以用-I.來(lái)指定。上面我們提到的–cflags參
數(shù)就是用來(lái)生成-I參數(shù)的。
g++ -I/myinclude test.cpp
- -Wall 打印警告信息
# 打印出gcc提供的警告信息
g++ -Wall test.cpp
- -std=c++11 設(shè)置編譯編譯標(biāo)準(zhǔn)
# 使用 c++11 標(biāo)準(zhǔn)編譯 test.cpp
g++ -std=c++11 test.cpp
- -o 指定輸出文件路徑與文件名
# 指定即將產(chǎn)生的文件名
# 指定輸出可執(zhí)行文件名為test
g++ test.cpp -o test
CMake
cmake是一個(gè)跨平臺(tái)的安裝編譯工具,可以用簡(jiǎn)單的語(yǔ)句來(lái)描述所有平臺(tái)的編譯過(guò)程。
語(yǔ)法特性
基本語(yǔ)法格式:指令(參數(shù)1 參數(shù)2……)
參數(shù)使用括號(hào)括起來(lái);
參數(shù)之間使用空格或者分號(hào)分開;
指令是大小寫無(wú)關(guān)的,參數(shù)和變量是大小寫相關(guān)的
set(HELLO hello.cpp)
add_executable(hello main.cpp hello.cpp)
ADD_EXECUTABLE(hello main.cpp ${HELLO})
變量使用 ${} 方式取值。
重要指令
cmake_minimum_required - 指定CMake的最低版本要求
語(yǔ)法: cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])
# CMake最小版本要求為2.8.3
cmake_minimum_required(VERSION 2.8.3)
project - 定義工程名稱,并可指定工程支持的語(yǔ)言
語(yǔ)法: : project(projectname [CXX] [C] [Java])
# 指定工程名為HELLOWORLD
project(HELLOWORLD)
**set - 顯式的定義變量
語(yǔ)法:set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
# 定義SRC變量,其值為sayhello.cpp hello.cpp
set(SRC sayhello.cpp hello.cpp)
include_directories - 向工程添加多個(gè)特定的頭文件搜索路徑 —>相當(dāng)于指定g++編譯器的-I參數(shù)
語(yǔ)法: include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
# 將/usr/include/myincludefolder 和 ./include 添加到頭文件搜索路徑
include_directories(/usr/include/myincludefolder ./include)
add_compile_options - 添加編譯參數(shù)
語(yǔ)法:add_compile_options()
# 添加編譯參數(shù) -Wall -std=c++11 -O2
add_compile_options(-Wall -std=c++11 -O2)
link_directories - 向工程添加多個(gè)特定的庫(kù)文件搜索路徑 —>相當(dāng)于指定g++編譯器的-L參數(shù)
語(yǔ)法: link_directories(dir1 dir2 …)
# 將/usr/lib/mylibfolder 和 ./lib 添加到庫(kù)文件搜索路徑
link_directories(/usr/lib/mylibfolder ./lib)
add_library - 生成庫(kù)文件
語(yǔ)法: add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
source1 source2 … sourceN)
# 通過(guò)變量 SRC 生成 libhello.so 共享庫(kù)
add_library(hello SHARED ${SRC})
add_executable - 生成可執(zhí)行文件
語(yǔ)法:add_executable(exename source1 source2 … sourceN)
# 編譯main.cpp生成可執(zhí)行文件main
add_executable(main main.cpp)
target_link_libraries - 為 target 添加需要鏈接的共享庫(kù) —>相同于指定g++編譯器-l參數(shù)
語(yǔ)法: target_link_libraries(target library1<debug | optimized> library2…)
# 將hello動(dòng)態(tài)庫(kù)文件鏈接到可執(zhí)行文件main
target_link_libraries(main hello)
aux_source_directory - 發(fā)現(xiàn)一個(gè)目錄下所有的源代碼文件并將列表存儲(chǔ)在一個(gè)變量中,這個(gè)指令臨時(shí)被用來(lái)自動(dòng)構(gòu)建源文件列表
語(yǔ)法: aux_source_directory(dir VARIABLE)
# 定義SRC變量,其值為當(dāng)前目錄下所有的源代碼文件
aux_source_directory(. SRC)
# 編譯SRC變量所代表的源代碼文件,生成main可執(zhí)行文件
add_executable(main ${SRC})
add_subdirectory - 向當(dāng)前工程添加存放源文件的子目錄,并可以指定中間二進(jìn)制和目標(biāo)二進(jìn)制存放的位置
語(yǔ)法: add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# 添加src子目錄,src中需有一個(gè)CMakeLists.txt
add_subdirectory(src)
以下為一個(gè)CMakeLists.txt的基本模板
# 指定最低版本
cmake_minimum_required(VERSION 3.0)
# 設(shè)定工程名稱
project(MYPROJECT)
# 設(shè)定編譯參數(shù)
add_compile_options(-Wall -std=c++11 -g -O2)
# 設(shè)定所有源碼列表,設(shè)定該指令可以簡(jiǎn)化add_execuable()指令的編寫
aux_source_directory(./src SRC_DIR)
# 包含頭文件路徑 include_directories("路徑1" "路徑1" ……) → g++ -I./***
include_directories(./include)
# 設(shè)定鏈接庫(kù)路徑,一般用于鏈接第三方庫(kù) link_directories("路徑1" “路徑2”...) → g++ -L./***
link_directories(../lib)
# 生成動(dòng)態(tài)/靜態(tài)鏈接庫(kù) add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
# add_library(動(dòng)/靜鏈接庫(kù)名稱 [STATIC/SHARED](可選參數(shù)默認(rèn)為STATIC) source1 source2 source3……)
add_library()
# 生成可執(zhí)行文件 add_executable(exename source1 source2 ... sourceN)
add_executable(mywsap main.cpp ${SRC_DIR})
# 為target添加需要鏈接的第三方庫(kù)、共享庫(kù) → g++ -l target_link_libraries(target library1<debug | optimized> library2...)
target_link_libraries()
CMake編譯工程
CMake目錄結(jié)構(gòu):項(xiàng)目主目錄存在一個(gè)CMakeLists.txt文件
兩種方式設(shè)置編譯規(guī)則:
- 在包含源文件的子文件夾中還包含CMakeLists.txt文件,主目錄的CMakeLists.txt通過(guò)
add_subdirectory(subdir1)
add_subdirectory(subdir2)
添加子目錄即可
這種編譯規(guī)則適用于項(xiàng)目較大結(jié)構(gòu)復(fù)雜的情況,當(dāng)項(xiàng)目包含多個(gè)模塊或者子系統(tǒng),每個(gè)模塊的編譯規(guī)則較為復(fù)雜時(shí),可以使用這種編譯規(guī)則。這樣可以將項(xiàng)目按模塊分解,每個(gè)模塊有自己獨(dú)立的 CMakeLists.txt 文件,使得項(xiàng)目結(jié)構(gòu)更加清晰。 - 在包含源文件的子文件夾中未包含CMakeLists.txt文件,子目錄編譯規(guī)則體現(xiàn)在主目錄的CMakeLists.txt中;
這種編譯規(guī)則適用于項(xiàng)目結(jié)構(gòu)相對(duì)簡(jiǎn)單,項(xiàng)目所包含的模塊數(shù)量較少,直接在主目錄的 CMakeLists.txt 文件中定義所有的編譯規(guī)則,簡(jiǎn)化項(xiàng)目的管理與維護(hù)。
編譯流程
- 在Windows系統(tǒng)下使用CMake構(gòu)建C/C++工程的流程
- 手動(dòng)編寫CMakeLists.txt文件,定義編譯規(guī)則。
- 執(zhí)行命令cmake PATH 生成Makefile文件(PATH是主目錄CMakeList.txt所在的目錄。) 如果你的電腦安裝了vs,那么此過(guò)程可能會(huì)調(diào)用微軟的MSVC編譯器,此時(shí)便需要使用cmake -G ”MinGw Makefiles" PATH 來(lái)指定編譯器。
- 執(zhí)行 mingw32-make.exe 命令進(jìn)行編譯。
- 在Linux系統(tǒng)下使用CMakeLists.txt構(gòu)建C/C++工程的流程
- 手動(dòng)編寫CMakeLists.txt文件,定義編譯規(guī)則。
- 執(zhí)行命令cmake PATH 生成Makefile文件(PATH是主目錄CMakeList.txt所在的目錄。)
- 執(zhí)行 make 命令 進(jìn)行編譯。
構(gòu)建方式文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-860848.html
- 內(nèi)部構(gòu)件
內(nèi)部構(gòu)建會(huì)在同級(jí)目錄下產(chǎn)生一大堆的中間文件,這些中間文件不是我們最終所需要的,和工程源文件放在一起會(huì)顯得雜亂無(wú)章。不推薦使用。
## 內(nèi)部構(gòu)建
# 在當(dāng)前目錄下,編譯本目錄的CMakeLists.txt,生成Makefile和其他文件
cmake .
# 執(zhí)行make命令,生成target
mingw32-make.exe
- 外部構(gòu)建
將編譯輸出文件與源文件放到不同目錄中
## 外部構(gòu)建
# 1. 在當(dāng)前目錄下,創(chuàng)建build文件夾
mkdir build
# 2. 進(jìn)入到build文件夾
cd build
# 3. 編譯上級(jí)目錄的CMakeLists.txt,生成Makefile和其他文件
cmake [-G "MinGW Makefiles"] ..
# 4. 執(zhí)行make命令,生成target
mingw32-make.exe
參考鏈接
添加鏈接描述文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-860848.html
到了這里,關(guān)于基于vscode的c++開發(fā)(Windows)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!