1 编译器MinGW
1.1 MinGW简介
MinGW
,即 Minimalist GNU For Windows
。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用 GCC
产生 Win32
程序
MinGW
提供了一套简单方便的Windows
下的基于GCC
程序开发环境。MinGW
收集了一系列免费的Windows
使用的头文件和库文件;同时整合了GNU
的工具集,特别是GNU
程序开发工具,如经典gcc, g++, make
等。MinGW
是完全免费的自由软件,它在Windows
平台上模拟了Linux
下GCC
的开发环境,为C/C++
的跨平台开发提供了良好基础支持,为了在Windows
下工作的程序员熟悉Linux
下的C/C++
工程组织提供了条件
1.2 MinGW下载安装
1.2.1 mini包安装
在windows
上借助MinGW
工具安装,下载地址:
迷你包按照:https://sourceforge.net/projects/mingw/(最新才更新到2021年)
这样下载后是一个mingw-get-setup.exe
,点击运行开始安装找个路径就可以了
在里面找到mingw32-gcc.bin
,mingw32-gcc-g++.bin
以及mingw32-gdb.bin
第一个是c
语言文件的编译器,第二个是c++
的,第三个是用来调试编译后文件的。
然后点Installation->Apply Changes.
1.2.2 全量包安装
64位最新:https://sourceforge.net/projects/mingw-w64/files/(一直到2022还在更新),如下不能点击DownLoad Latest Version
,这样下载下来是zip包,而是点击下面的 MinGW-W64-install.exe
,才可以快速安装
安装时可能报错:The file has been downloaded incorrectly!
问题原因:产生此类的问题的原因是,使用在线安装的时候需要下载文件。由于网络原因导致下载失败,解决方案如下。
解决方法:咱们可以不使用在线安装的形式,可以直接下载安装包,然后解压缩,配置环境变量就可以了。
解压x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z,得到 mingw64
,将该文件夹copy之任意处,并将路径添加到系统环境变量Path中
1.2.3 压缩包安装
还是使用全量包地址:https://sourceforge.net/projects/mingw-w64/files/,解压缩后即可直接使用
1.2.3.1 MinGW 各版本参数说明
MinGW
可以适应不同系统开发环境,因此有几大参数需要进行选择: Version
、Architecture
、Threads
、Exception
Version
:指的是你选择的GCC
编译器的版本,一般建议选择最新的版本;Architecture
:指的是你的电脑的系统类型,i686
表示的是32
位的系统类型,x86_64
表示的是64
位的系统类型;Threads
:指的是线程模型,posix
或win32
;Exception
:指的是异常处理模型。i686
系统架构有两种选择:dwarf
和sjlj
;x86_64
系统架构也有两种选择:seh
和sjlj
1.2.3.2 posix VS win32的区别
GCC for Windows
带有两个线程模型:win32
和posix
posix
(Portable Operating System Interface
,可移植操作系统接口),是 UNIX 系统的一个 API 设计标准,很多类 UNIX 系统也在支持兼容这个标准,如 Linux 操作系统。
posix
启用c++11/c11
多线程功能。 依赖于libwinpthreads
,即使不直接调用API
,也将分发给winpthreads
Win32
,是Windows
系统下一个 API 设计标准。
win32
没有C++11
多线程功能
小结:win32
:没有 C++ 11
多线程特性;posix
:支持 C ++ 11
多线程特性。
如果在 Windows
下开发 Linux 应用程序,则选择 posix;
如果开发 Windows
平台下的应用程序,就需要选择 Win32;
1.2.3.3 sjij VS seh VS dwarf
在 C++
中有 try…throw…catch
,当它执行这种结构时,它需要保存现场还原现场,而 sjlj,seh,dwarf
正是实现这类过程的三种方式。
sjlj
:全称是SetJump / LongJump
,前者设还原点,后者跳到还原点。跨平台,可用于 32 位或者 64 位系统。缺点是:运行速度稍慢seh
:(Structured Exception Handling,结构化异常处理)是 Borland 公司的,微软买了其专利使用权,它利用了 FS 段寄存器,将还原点压入栈,收到异常时再弹出。相较而言,sjlj 是 C 标准库就有的东西,seh 在 2014 年前是有专利的,从性能上说 seh 比 sjlj 快。只用于64位系统。dwarf
:一种带调试信息(DWARF- 2(DW2)EH
)的包, 所以比一般的包尺寸大,只支持32位系统 – 没有永久的运行时间开销 – 需要整个调用堆栈被启用,这意味着exception不能被抛出,例如Windows系统DLL。
小结:
- x86_64 64位
seh
是新发明的,而sjlj
则是古老的。只用于64位系统。
seh
性能比较好,但不支持 32位。sjlj
稳定性好,支持 32位和64位。
因此,x86_64
系统架构的推荐使用seh
的异常处理模型。 - i686 32位
dwarf
只支持 32 位,而sjlj
支持 32 位或64 位,但是dwarf
的性能要优于 sjlj。
因此,i686
系统架构的推荐使用dwarf
的异常处理模型。
1.3 配置MinGW的环境变量
配置如下:
添加到环境变量path
中去
1.4 验证配置的MinGW
打开DOS
窗口gcc -v
和gdb -v
1.5 下载更新包
MinGW
的包管理工具是 mingw-get
,可以通过以下步骤下载新包:
- 打开命令行窗口,进入
MinGW
的安装目录,比如 C:\MinGW\bin。 - 输入命令
mingw-get update
,更新包管理器的列表。 - 输入命令
mingw-get install <package>
,其中<package>
是要安装的包的名称,比如 mingw32-libz。 - 等待安装完成。
注意
:有些包可能需要先安装其它依赖包,需要根据提示进行安装
2 VSCode配置
2.1 安装插件
这些插件看自己情况,还可以添加其他额外插件
2.1.1 C/C++插件
2.1.2 中文简体插件
2.1.3 CodeRunner插件
2.1.4 自动完成插件
2.2 配置json文件
在任意位置新建空文件夹,然后新建一个后缀为.c
的文件,如test.c
按下F5
调试(F5
和Ctrl+F5
的区别)
F5
:启动调试,启动目标文件并将调试器附加到目标进程中,一般用于通过加断点调试用;Ctrl+F5
:开始执行(不调试
),启动目标文件,但不附加调试器。一般会单独出现一个运行结果界面
2.2.1 json中用到的变量
假设当前workspace
的路径为:C:\Users\admin\Desktop\test
,workspace
文件夹下的结构如下(+
表示下一层):C:\Users\admin\Desktop\test
+.vscode
++tasks.json
++launch.json
+main.cpp
${workspaceFolder}:
表示当前workspace
文件夹路径,也即C:\Users\admin\Desktop\test
${workspaceRootFolderName}:
表示workspace
的文件夹名,也即test
${file}:
文件自身的绝对路径,也即C:\Users\admin\Desktop\test\.vscode\launch.json
${relativeFile}:
文件在workspace
中的路径,也即.vscode\launch.json
${fileBasenameNoExtension}:
当前文件的文件名,不带后缀,也即launch
${fileBasename}:
当前文件的文件名,launch.json
${fileDirname}:
文件所在的文件夹路径,也即C:\Users\admin\Desktop\test\.vscode
${fileExtname}:
当前文件的后缀,也即.json
${lineNumber}:
当前文件光标所在的行号${env:PATH}:
系统中的环境变量
2.2.2 launch.json
按下F5
后VSCode
会跳出一个launch.json
的一个配置文件,修改这几个地方就好
选择C++(GDB/LLDB)
选择gcc.exe生成活动文件
// https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示
"type": "cppdbg", // 配置类型,这里只能为cppdbg
"request": "launch", // 请求配置类型,可以为launch(启动)或attach(附加)
"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe", // 将要进行调试的程序的路径
"args": [], // 程序调试时传递给程序的命令行参数,一般设为空即可
"stopAtEntry": false, // 设为true时程序将暂停在程序入口处
"cwd": "${workspaceFolder}", // 调试程序时的工作目录
"environment": [], // (环境变量?)
"externalConsole": true, // 调试时是否显示控制台窗口,一般设置为true显示控制台
"MIMode": "gdb", // 指定连接的调试器,可以为gdb或lldb。一般为gdb
"miDebuggerPath": "E:\\SoftWare-C\\MinGW\\bin\\gdb.exe", // 调试器绝对路径。
"preLaunchTask": "gcc" // 调试会话开始前执行的任务,一般为编译程序。必须与tasks.json的label相对应
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
2.2.3 task.json
配置完launch.json
后,继续F5
调试报错:
选择第二个配置任务
// https://code.visualstudio.com/docs/editor/tasks
{
"version": "2.0.0",
"tasks": [
{
"label": "gcc", // 任务名称,与launch.json的preLaunchTask相对应
"command": "gcc", // 要使用的编译器
"args": [
"${file}",
"-o", // 指定输出文件名,不加该参数则默认输出a.exe
"${fileDirname}/${fileBasenameNoExtension}.exe",
"-g", // 生成和调试有关的信息
"-Wall", // 开启额外警告
"-static-libgcc", // 静态链接
], // 编译命令参数
"type": "shell",
"group": {
"kind": "build",
"isDefault": true // 设为false可做到一个tasks.json配置多个编译指令,需要自己修改本文件,我这里不多提
},
"presentation": {
"echo": true,
"reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never。具体参见VSC的文档
"focus": false, // 设为true后可以使执行task时焦点聚集在终端,但对编译c和c++来说,设为true没有意义
"panel": "shared" // 不同的文件的编译信息共享一个终端面板
}
// "problemMatcher":"$gcc" // 如果你不使用clang,去掉前面的注释符,并在上一条之后加个逗号。照着我的教程做的不需要改(也可以把这行删去)
}
]
}
2.2.4 c_cpp_properties.json
当配置完test.c
后发现,#include <stdio.h>
报错,下面有红色曲线
可以在c_cpp_properties.json
中配置修改
ctrl+shift+P
打开Command Palette
,运行C/Cpp: Edit configurations...
生成c_cpp_properties.json:
{
"configurations": [
{
"name": "Win64",
"includePath": [ //主要修改的就是这一步,把MinGW的路径配置进去 **是递归查找这个文件夹下的文件
"e:/software-c/mingw/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"intelliSenseMode": "msvc-x64"
}
],
"version": 4
}
2.3 异常
2.3.1 一直运行
如果点击运行时,提示code is already running
,可以在输出台里,右键选择stop code run
2.3.2 打开新文件会覆盖之前打开的文件
VS Code IDE 界面,通过路径 Code -> Preferences -> Settings 进入VS Code 设置。
enablePreview
(选项在Workbench
工作台中)搜索,然后将箭头指示的地方的对勾取消即可,再次打开文件就不会覆盖原窗口文件了
2.3.3 vscode运行c文件可从终端输入
选择左上角文件->首选项(preferences)->设置(settings)
在搜索中输入RunInTerminal
并勾选
同时,launch.json
中的configurations
添加"externalConsole": true,
2.3.4 更改vscode终端乱码
由于win10
默认的dos
窗口是gbk
,可以输入chcp
查看
chcp
码值对应编码:
655001
:代表UTF-8
编码936
: 代表GBK
编码
修改vscode或者cmd编码方法
- 修改vscode
- 把vscode编码修改为gbk
在设置中搜索Encoding
,修改为gbk即可 - 修改tasks.json
但这种方法只需要在tasks.json
的args
项下添加一行"-fexec-charset=gbk"
即可 - 可以直接在
setting.json
- 把vscode编码修改为gbk
"code-runner.executorMap":{
"cpp":"chcp 65001 "
}
- 修改cmd编码为UTF-8
- 临时修改。
输入chcp 65001
可以将当前窗口的编码形式修改为UTF-8
- 永久修改
打开注册表:
win+R
输入regedi
查找HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor
右键,新建->字符串值
命名为autorun
;
点击右击修改,数值数据填写chcp 65001
- 临时修改。
3 通过vscode连接mysql
3.1 下载连接工具包
C语言
调用MySQL
,需要工具 Windows C Connector
下载地址:https://downloads.mysql.com/archives/c-c/
根据自己的MinGW来选择32位还是64位连接
注意
:如果出现类似undefined reference to mysql_init@4
的问题就需要调整一下Windows C Connector
文件的版本在
3.2 转换文件为libmysql.a
由于MySQL
官方下载的Windows C
开发包只能原生态支持CL
编译器,而用GCC
也并非不可,只是需要做一些额外的工作。
先下载一下MinGW工具包
,下载地址是:http://prdownloads.sourceforge.net/mingw/mingw-utils-0.2.tar.gz?download
解压后,将此工具包中的bin
目录加入系统环境变量的Path变量
然后,在Mysql
开发包的lib
目录下,即libmysql.lib和libmysql.dll
的所在目录,运行如下命令,得到导出文件 libmysql.def
reimp -d libmysql.lib
然后在此目录运行MinGW GCC
本身自带的命令
dlltool -k -d libmysql.def -l libmysql.a
得到我们最后需要链接的库文件libmysql.a
3.3 修改c_cpp_properties.json
3.3.1 生成文件
点击VSCode
软件右下角的字样为Win32
的按钮,它就是C/C++
插件的配置;
在弹出的搜索框选择编辑配置(JSON
);
就可以看到自动生成c_cpp_properties.json
文件了
3.3.2 编辑文件
在 c_cpp_properties.json
文件里的inlucdePath
域里增加mysql
的include
的路径,这里主要是解决编辑器里的头文件报波浪线的问题
3.4 修改运行命令
需要看使用了coderunner
插件,如果没用,就直接修改task.json
,否则,需要修改coderunner
插件中的code-runner.executorMap
属性,因为coderunner
插件会覆盖task.json
运行命令
3.4.1 没用coderunner
按照如下方式修改
增加-I域
和-L域
,-I域
下添加上述的mysql
的include
目录,-L
域下添加上述的mysql
的lib
目录,最后加上-lmysql
3.4.2 使用coderunner
如果使用了coderunner
插件,那么就需要修改coderunner
插件中的code-runner.executorMap
属性
"code-runner.executorMap": {
"c": "cd $dir && gcc $fileName -I D:/SoftWare/SQL/MySQL/mysql-connector-c-6.1.11-winx64/include -L D:/SoftWare/SQL/MySQL/mysql-connector-c-6.1.11-winx64/lib -lmysql -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
}
3.4.3 添加libmysql.dll
把Windows C Connector
对应版本的lib目录下的libmysql.dll
文件复制到,当前运行程序内,如下:
3.5 连接示例
#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"
int main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
// 初始化MySQL连接
conn = mysql_init(NULL);
// 连接到MySQL数据库
if (mysql_real_connect(conn, "localhost", "root", "root", "test", 3306, NULL, 0)) {
// 执行SQL查询
if (mysql_query(conn, "SELECT * FROM user_info")) {
fprintf(stderr, "SELECT query failed: %s\n", mysql_error(conn));
mysql_close(conn);
return 1;
}
// 存储查询结果
res = mysql_store_result(conn);
// 遍历查询结果
while ((row = mysql_fetch_row(res))) {
printf("Column1: %s, Column2: %s,Column3: %s,Column4: %s,Column5: %s\n", row[0], row[1], row[2], row[3], row[4], row[5]);
}
// 释放结果集
mysql_free_result(res);
} else {
fprintf(stderr, "Connection to MySQL failed: %s\n", mysql_error(conn));
}
// 关闭MySQL连接
mysql_close(conn);
return 0;
}