MinGW将其托管到sourceforge上了,也可以前往sourceforge下载:https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/?tdsourcetag=s_pctim_aiomsg
链接:https://pan.baidu.com/s/17QB1_ILBtAMf9Da1oTxT-A
提取码:2k6l
Version 指的是 gcc 的版本,如果没有特殊的需求,一般选择最高的版本号即可。
操作:在这个版本中,最高版本是 6.2.0 ,选中它即可。
Architecture 是指电脑系统是 32位 还是 64位,根据你的电脑系统做出对应选择。
操作:我的电脑系统是 64位 的,所以我选择了 x86_64,如果你是 32位 系统,则选择 i686 即可。
这个世界上只有两种操作系统,符合 posix 协议的,和 Windows 。如这个笑话所说的,如果你想要开发 Windows 程序,需要选择 win32 ,而开发 Linux、Unix、Mac OS 等其他操作系统下的程序,则需要选择 posix 。
异常处理在开发中非常重要,你在开发的过程中,大部分的时间会耗在处理各种异常情况上。如果你之前选择了 64位,则这里有两个异常处理模型供你选择,seh 是新发明的,而 sjlj 则是古老的。seh 性能比较好,但不支持 32位。 sjlj 稳定性好,支持 32位。
选择了 32位 后,则可以用 dwarf 和 sjlj 两种异常处理模型。同样的,dwarf 的性能要优于 sjlj ,可以它不支持 64位 。建议选择 dwarf 。
Build revision 默认就好.
网盘链接:https://pan.baidu.com/s/1_8CUg-0ckmGM-UWWNE8tYg
提取码:1kp6
CMake官网下载:下载导航->
MinGW 和 CMake下载完后需要配置系统环境变量,将MinGW和CMake下的bin目录添加进去即可,在cmd下输入 g++ --version 和 cmake --version有版本号输出说明MinGW ,CMake安装成功。
先编写main.cpp 和swap.cpp
main.cpp其中代码为:
//main.cpp
#include
#include "Lib/swap.h"
using namespace std;
int main(int argc, char **argv)
{
int v1 = 100;
int v2 = 200;
cout << "Before:" << v1 << " " << v2 << endl;
swap(v1,v2);
cout << "After:" << v1 << ' ' << v2 << endl;
cout << "cmake调试\n";
system("pause");
return 0;
}
swap.h 和 swap.cpp 的代码为:
void swap(int &a, int &b);
#include "swap.h"
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
CMakeLists.txt 的代码为:
cmake_minimum_required (VERSION 2.8.12)#规定cmake的最低版本要求
project(MySwap)#项目的名称,不一定和你的文件夹名称一样
set(CMAKE_BUILD_TYPE "Debug") #打断点调试代码必设置,Cmake默认是Release会导致断点失效
include_directories(${PROJECT_SOURCE_DIR}/source/Lib)#添加头文件的搜索路径
#要用的cpp文件有哪些地址就要添加源文件路径
aux_source_directory(./source SrcFiles)#将源文件列表写在变量SrcFiles中
aux_source_directory(./source/Lib SrcFiles)#工程项目较大,要创建多个模块
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/build)#设置可执行文件输出路径
add_executable(main ${SrcFiles})#设置可执行文件的名称,make之后build目录下出现main.exe
在cmake编译之前,先使用之前下载的MinGW配置一些cmake环境。安装好cmake后左边会有如图所示图标。
配置好后,发现会生成build文件,点击后生成的目录应该是这样的,bulid里面可能版本不一样生成的文件有些许差距
这是Cmake Tools工具帮你直接生成的,省去在终端cmake,之后直接点击vscode下方的 运行按钮
build目录下会生成一个 main.exe可执行文件,并且可在终端查看运行结果。
在编写完代码后,目录是这样的
之后开始操作,首先新建终端
建立build文件夹,再cd到build目录下
之后在终端处输入cmake ..
,如果你电脑上装了vs20xx,可能会出现用MSVC生成makefile工程的情况
或者出现下面错误
出现上面两种错误都是使用命令 rm *
, 选择全部删除之前的工程配置即可,再使用 cmake -G "MinGW Makefiles" ..
代替cmake ..
出现用g++编译就ok,之后在终端输入 mingw32-make.exe
, 回车就大功告成
最终生成的目录跟方法1一样
按下图编辑一个tasks.json文件,编辑tasks.json文件的目的是即时更新代码会重新编译exe程序,以及省去终端的手动makefile的过程
{
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build"
},
"tasks": [
{
"type": "shell",
"label": "cmake",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make",
"group": {
"kind": "build",
"isDefault": true
},
"command": "mingw32-make.exe", //windows下的命令
"args": [
]
},
{
"label": "Build",
//依赖于上面两个task命令
"dependsOn":[
"cmake",
"make"
]
}
]
}
将生成的launch.json文件按照下列代码更改即可进行程序调试。
{
"version": "0.2.0",
"configurations": [
{
"name": "g++.exe",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/${fileBasenameNoExtension}.exe",//${fileBasenameNoExtension}
// "program": "${command:cmake.launchTargetPath}", //${fileBasenameNoExtension}
//如果用上面这条program的设置,可以一键调试,需要注释preLaunchTask同时可以不需要编写tasks.json,需要安装cmake Tool插件
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,//是否有黑框框
"MIMode": "gdb",
"miDebuggerPath": "F:/MinGW64/bin/gdb.exe", //调试器地址
"preLaunchTask": "Build" //预编译,调用tasks.json,与tasks.json里面的label一致
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
到此,程序即可进行调试
这里解释一下args中自定义 exe文件存放路径:
${workspaceFolder}: 当前工作路径
exe: 自己建的文件夹
${fileBasenameNoExtension}: 当前文件的文件名,NoExtension意思就是不带后缀名,然后加个 .exe 就是当前的exe文件,也就是编译生成的 exe 文件
上述路径放一起意思就编译生成的 exe 文件放在exe文件夹中, 把这条配置删除的话,编译生成的exe文件就默认放在了当前工作路径下。
顺便说一下 vscode 中一些变量代表什么意思
${workspaceFolder} :表示当前workspace文件夹路径,也即/home/Coding/Test
${workspaceRootFolderName}:表示workspace的文件夹名,也即Test
${file}:文件自身的绝对路径,也即/home/Coding/Test/.vscode/tasks.json
${relativeFile}:文件在workspace中的路径,也即.vscode/tasks.json
${fileBasenameNoExtension}:当前文件的文件名,不带后缀,也即tasks
${fileBasename}:当前文件的文件名,tasks.json
${fileDirname}:文件所在的文件夹路径,也即/home/Coding/Test/.vscode
${fileExtname}:当前文件的后缀,也即.json
${lineNumber}:当前文件光标所在的行号
${env:PATH}:系统中的环境变量