目录
目录
一、g++
1、g++编译器
1.1预处理(Preprocessing):
预处理器负责处理源代码中的预处理指令,例如宏定义(#define)、头文件包含(#include)和条件编译(#ifdef、#ifndef等)。
1.2编译(Compilation):
编译器将预处理后的源代码文件转换为目标代码,通常是汇编语言代码。编译器检查错误,优化代码。
1.3汇编(Assembly):
汇编器负责将汇编语言代码转换为机器语言代码,生成目标文件(通常为.o或.obj文件)。
1.4链接(Linking):
链接器负责将多个目标文件和库文件链接成一个可执行文件(例如.exe或.out文件)。
2、编译分为多个步骤的优点
模块化和分层:将整个编译过程分为多个步骤,有助于实现编译器的模块化设计和分层结构。这使得编译器更易于开发、维护和升级,同时也方便支持不同的编程语言和目标平台。
效率和可扩展性:分阶段编译允许对不同阶段进行单独的优化,提高编译效率。例如,在编译阶段进行代码优化,可以在不影响其他阶段的情况下提高程序运行时的性能。此外,分阶段编译还有利于支持增量编译,即只重新编译修改过的源文件,而不是整个项目,从而加快编译速度。
跨平台兼容性:将编译过程分为多个步骤,有助于提高编译器的跨平台兼容性。例如,汇编阶段使得编译器能够针对不同的目标平台生成对应的机器语言代码,而无需为每个平台编写不同的编译器。这样,开发者可以更容易地将程序移植到不同的硬件和操作系统上。
错误诊断和调试:分阶段编译有助于更准确地定位和诊断编译错误。例如,如果编译器在编译阶段报告语法错误,那么开发者可以专注于检查源代码的语法,而不需要关注其他阶段的问题。此外,分阶段编译还可以生成中间表示(如汇编代码),便于开发者在调试过程中深入了解程序的运行机制。
二、gdb调试器
很多IDE都是调用gdb去调试
1、g++ main.cpp -g -o main_exe //需要使用-g 使可执行文件附带debug的内容
2、常见的gdb命令
- gdb main_exe //gdb可执行文件
- (gdb)help(h)
- (gdb)run(r) //运行文件
- (gdb)break 10 //在第十行设置断点
- (gdb)continue(c) //继续执行
- (gdb)list 10 //显示第十行附近代码
- (gdb)diplay value //监测变量value的值
- (gdb)quit(q)
三、VS Code实战记录
两种运行方式
1、使用g++命令
2、使用CMakeLists.txt文件操作
main.cpp
#include "swap.h"
int main(int argc, char **argv)
{
swap Myswap(10, 20);
std::cout << "before" << std::endl;
Myswap.printInfo();
Myswap.run();
std::cout << "after" << std::endl;
Myswap.printInfo();
return 0;
}
swap.cpp
#include "swap.h"
void swap::run()
{
int temp;
temp = _a;
_a = _b;
_b = temp;
}
void swap::printInfo()
{
std::cout <<"_a = "<< _a << std::endl;
std::cout <<"_b = "<< _b << std::endl;
}
swap.h
#pragma once
#include <iostream>
class swap
{
public:
swap(int a, int b)
{
this->_a = a;//this -> _a ????
this->_b = b;
}
void run();
void printInfo();
private:
int _a;
int _b;
};
1、命令行
g++ main.cpp src/Swap.cpp -Iinc
2、CMakeLists.txt
#系统要求最低cmake的版本
cmake_minimum_required(VERSION 3.0)
#项目名称
project(SWAP)
#头文件路径文件夹
include_directories(inc)
#生成可执行文件所需要的.cpp文件
add_executable(swap_main main.cpp src/swap.cpp)
四、CMake
1、CMake特型
CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。
2、常用CMake指令
-
cmake_minimum_required - 指定CMake的最小版本要求
语法: cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])1 # CMake最小版本要求为2.8.3 2 cmake_minimum_required(VERSION 2.8.3)
-
project - 定义工程名称,并可指定工程支持的语言
语法: project(projectname [CXX] [C] [Java])
1 # 指定工程名为HELLOWORLD
2 project(HELLOWORLD)
- add_library - 生成库文件
语法: add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
1 # 通过变量 SRC 生成 libhello.so 共享库
2 add_library(hello SHARED ${SRC})
- target_link_libraries - 为 target 添加需要链接的共享库 --->相同于指定g++编译器-l参数
语法: target_link_libraries(target library1<debug | optimized> library2...)
1 # 将hello动态库文件链接到可执行文件main
2 target_link_libraries(main hello)
- add_executable - 生成可执行文件
语法:add_executable(exename source1 source2......)
1 # 编译main.cpp生成可执行文件main
2 add_executable(main main.cpp)
3、CMake变量
CMAKE_CXX_FLAGS g++编译选项
1 # 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
2 set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
CMAKE_BUILD_TYPE 编译类型(Debug, Release)
1 # 设定编译类型为debug,调试时需要选择debug
2 set(CMAKE_BUILD_TYPE Debug)
3 # 设定编译类型为release,发布时需要选择release
4 set(CMAKE_BUILD_TYPE Release)
tips:使用CMake时使用外部构建,可以使生成的中间文件都放在一个文件夹里
1##在终端以依次输入以下命令
2
3 # 1. 在当前目录下,创建build文件夹
4 mkdir build
5 # 2. 进入到build文件夹
6 cd build
7 # 3. 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
8 cmake ..
9 # 4. 执行make命令,生成target
10
make
五、.json文件的学习
1、.json文件的作用及基础知识
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。[百度百科]
2、如何去编写.json
首找到你的main.cpp,双击打开,然后依次选择以下内容
接下来就会出现launch.json、tasks.json两个文件
launch.json(有两个重要的地方已经标出来)
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/my_cmake_exe",///importnt,可执行文件的路径
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
// "cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "Build",/important,debug之前需要运行tasks.json
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
tasks.json
{
"options": {
"cwd": "${workspaceFolder}/build"
},
"tasks": [//this task include three small tasks,1-cmake 2-make 3-Build
{
"type": "shell",
"label": "cmake",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"command": "make",
"args": [
],
"group": {
"kind": "build",
"isDefault": true
}
},
{
"label": "Build",//the task's user interface labele
"dependsOrder": "sequence",
"dependsOn":[ //Perform the fllowing tasks in order.
"cmake",
"make"
]
}
],
"version": "2.0.0"
}
点击F5自动debug
六、使用CMake和CMake tools插件
首先安装这两个插件
然后打开指令面板
搜索找到CMake配置,选择它
现在你只需要有代码文件和CMakeLists.txt,点击build整个项目,运行项目就好