如何在VS里使用MySQL提供的mysql Connector/C++的debug版本
前提知识
了解MySQL Connector/C++
MySQL Connector/C++ 是 MySQL 官方提供的 C++ 连接库,用于在 C++ 应用程序中连接和操作 MySQL 数据库,以下是关于它的详细介绍:
概念
MySQL Connector/C++ 是一个遵循 C++ 标准的数据库连接 API,它封装了与 MySQL 数据库服务器进行通信的底层细节,为 C++ 开发者提供了一组易于使用的接口。通过这些接口,开发者可以方便地执行 SQL 查询、插入、更新、删除等操作,管理数据库连接,处理事务等,而无需深入了解 MySQL 协议的复杂细节。
在不同平台使用API
这篇文字主要讲解一下如何在Visual Studio配置。
MySQL Connector/C++可以在多种开发平台上使用,以下是在不同平台以及不同项目管理方式下的使用说明:
在 Visual Studio 中使用
Visual Studio是Windows平台上常用的集成开发环境(IDE),支持使用其自身的项目属性管理来配置MySQL Connector/C++。
- 安装MySQL Connector/C++:从MySQL官方网站下载适合的版本(https://dev.mysql.com/downloads/connector/cpp/),下载完成后解压到指定目录。
- 配置项目属性
- 包含目录:右键点击项目,选择“属性”,在“配置属性” -> “VC++ 目录” -> “包含目录”中,添加MySQL Connector/C++解压目录下的
include
文件夹路径,让编译器能够找到相关的头文件。 - 库目录:在“配置属性” -> “VC++ 目录” -> “库目录”中,添加解压目录下的
lib
文件夹路径(根据你的平台是x86还是x64,选择对应的lib
文件夹),以便链接器找到库文件。 - 附加依赖项:在“配置属性” -> “链接器” -> “输入” -> “附加依赖项”中,根据你使用的是Debug还是Release配置,添加对应的库文件(例如
mysqlcppconn.lib
或mysqlcppconnd.lib
)。 - 动态链接库(DLL):将解压目录下
bin
文件夹中的相关DLL文件(如mysqlcppconn8-2-vs14.dll
)复制到项目的可执行文件所在目录,或者将bin
目录添加到系统的PATH
环境变量中,确保运行时能够找到这些DLL。
- 包含目录:右键点击项目,选择“属性”,在“配置属性” -> “VC++ 目录” -> “包含目录”中,添加MySQL Connector/C++解压目录下的
在 Visual Studio Code 中使用
Visual Studio Code是一个轻量级、跨平台的代码编辑器,结合C++扩展和CMake等工具可以实现对MySQL Connector/C++的使用。
- 安装必要的扩展:在VS Code中安装“C/C++”扩展,用于提供C++语言的支持。
- 安装MySQL Connector/C++:与在Visual Studio中一样,从官方网站下载并解压。
- 配置CMake:创建
CMakeLists.txt
文件,示例内容如下:
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 设置C++标准
set(CMAKE_CXX_STANDARD 11)# 添加MySQL Connector/C++的包含目录
include_directories("path/to/mysql-connector-cpp/include")# 添加可执行文件
add_executable(MyProject main.cpp)# 链接MySQL Connector/C++库
target_link_libraries(MyProject "path/to/mysql-connector-cpp/lib/mysqlcppconn.lib")
这里"path/to/mysql-connector-cpp"
需要替换为实际的MySQL Connector/C++解压目录路径。
4. 编写和运行代码:在VS Code中打开项目文件夹,在终端中执行cmake.
生成构建文件,然后执行cmake --build.
编译项目,最后运行生成的可执行文件。
在 Linux 平台上使用
Linux平台上可以使用CMake等构建工具来管理项目并使用MySQL Connector/C++。
- 安装MySQL Connector/C++:可以通过包管理器安装(如果有对应的包),或者从官方网站下载源码进行编译安装。例如,在Debian/Ubuntu系统中可以尝试以下命令安装(如果存在对应版本的包):
sudo apt-get install libmysqlcppconn-dev
- 配置CMake:同样创建
CMakeLists.txt
文件,示例如下:
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 设置C++标准
set(CMAKE_CXX_STANDARD 11)# 添加MySQL Connector/C++的包含目录
include_directories(/usr/include/mysqlcppconn)# 添加可执行文件
add_executable(MyProject main.cpp)# 链接MySQL Connector/C++库
target_link_libraries(MyProject mysqlcppconn)
如果是通过源码安装,需要将/usr/include/mysqlcppconn
替换为实际的包含目录路径,mysqlcppconn
替换为实际的库文件名(如果有不同)。
3. 编译和运行:在终端进入项目目录,执行cmake.
和make
命令进行编译,编译完成后运行生成的可执行文件。
使用其他项目管理方式
除了上述常见的方式,还可以使用如Premake、Meson等项目
VS项目属性介绍
在Visual Studio项目中,VC++目录和C/C++是两个不同但又相互关联的配置模块,它们各自承担着不同的功能,下面为你详细介绍:
VC++目录
- 设置内容
- 包含目录:指定编译器查找包含文件(.h文件)的目录路径,比如第三方库的头文件目录,像MySQL Connector/C++的头文件所在目录就可以添加到这里,多个目录之间用分号隔开。
- 库目录:用于告诉链接器查找库文件(.lib文件)的位置,例如MySQL Connector/C++的静态库文件所在目录,同样支持多个路径以分号分隔。
- 可执行目录:指定链接器查找可执行文件的目录,不过在实际使用中,一般较少配置这个选项。
- 源目录:主要用于指定项目中源文件的查找路径,使用频率相对较低。
- 功能:VC++目录主要负责帮助编译器和链接器找到项目所需的外部资源文件,侧重于文件路径的管理,从而让项目能够顺利包含所需的头文件,链接到对应的库文件,确保项目在编译和链接阶段能够正确找到所需的资源。
- 示例:在使用MySQL Connector/C++库时,需要在“包含目录”中添加其
include
文件夹路径,让编译器能找到相关头文件;在“库目录”中添加lib
文件夹路径,方便链接器定位库文件。
C/C++
- 设置内容
- 常规:包含“附加包含目录”,和VC++目录中的“包含目录”功能类似,都是指定头文件的查找路径。此外还可以设置调试信息格式、警告等级等。
- 预处理器:用于定义预处理器宏,比如常见的
DEBUG
宏,通过定义这些宏可以在代码中使用#ifdef
等预处理指令来控制代码的编译分支。还可以设置预处理器定义的附加选项。 - 语言:可以设置C++语言的相关特性,例如是否启用匿名类型、范围检查等。
- 代码生成:涉及到代码生成的一些选项,比如运行时库的选择(多线程调试 DLL (/MDd)、多线程 (/MT)等),堆栈保留大小,是否启用最小重新生成等。
- 优化:用于设置代码优化选项,如优化级别(/Od表示禁用优化,/O2表示最大化优化等)、内联函数扩展方式等。
- 功能:C/C++模块主要聚焦于对C++编译过程的精细控制,通过各种设置来影响编译器如何处理和生成代码,涉及到代码的预处理、语言特性、生成规则以及优化策略等方面。
- 示例:如果项目使用了特定的宏来控制调试和发布版本的行为,就需要在“预处理器”中定义相关宏;如果对代码的性能有要求,可以在“优化”中选择合适的优化级别。
二者区别
- 配置侧重不同:VC++目录更关注文件路径,为编译器和链接器查找外部资源提供指引;C/C++模块着重于对编译过程本身的参数设置,影响代码的编译行为和生成结果。
- 影响阶段不同:VC++目录主要影响编译和链接阶段查找文件的过程;C/C++模块主要影响编译阶段对代码的处理方式。
配置API是否两个都要配置
配置API相关的库时,通常两个部分都需要进行配置,但配置的目的和内容有所不同:
- VC++目录:必须配置“包含目录”和“库目录”,确保编译器能找到API的头文件,链接器能找到对应的库文件。例如配置MySQL Connector/C++库时,这两个目录的配置是必不可少的。
- C/C++:一般需要配置“附加包含目录”(和VC++目录中的“包含目录”选其一配置即可,建议优先配置VC++目录中的) ,同时根据API库的要求和项目的实际情况,可能还需要在“预处理器”中定义相关宏,或者在“代码生成”中选择合适的运行时库等。比如某些API库要求定义特定宏才能启用某些功能,就需要在“预处理器”中进行设置。
在 Visual Studio 中链接动态库(.dll)时,配置方式与静态库(.lib)有所不同,动态库的“目录配置”主要体现在两个阶段:编译链接阶段和运行阶段。以下是具体说明:
一、动态库(.dll)的配置逻辑
动态库在使用时分为两个关键文件:
- 导入库(.lib):编译链接阶段需要,用于告诉编译器“这些函数的实现在.dll中”,本质是.dll的“索引表”。
- 动态库本身(.dll):运行阶段需要,程序执行时会加载.dll以获取实际函数实现。
因此,配置动态库需要同时处理这两个文件的路径。
二、具体配置步骤(以 MySQL Connector/C++ 的动态库为例)
1. 编译链接阶段:指定导入库(.lib)的目录(必须配置)
动态库的导入库(.lib)需要在编译链接时被找到,这一步与静态库的配置相同:
- 通过 VC++ 目录配置(推荐):
项目属性 → VC++ 目录 → 库目录 → 添加导入库(.lib)所在的目录(例如D:\mysql-connector-cpp\lib64
)。 - 通过链接器配置:
项目属性 → 链接器 → 常规 → 附加库目录 → 添加相同的.lib目录(与上面二选一即可,推荐前者)。
同时,需要在 链接器 → 输入 → 附加依赖项 中填写导入库的文件名(例如 mysqlcppconn8.lib
)。
2. 运行阶段:指定.dll文件的目录(必须配置,否则运行时出错)
程序运行时需要找到.dll文件,有3种常用方式(任选其一):
-
方法1:复制.dll到可执行文件目录(最推荐,避免环境干扰)
将动态库(.dll)复制到项目生成的.exe
所在目录(例如项目目录\x64\Debug
或x64\Release
)。
MySQL Connector/C++ 的.dll通常在bin64
目录下(如mysqlcppconn8-2-vs14.dll
)。 -
方法2:添加.dll目录到系统环境变量
Path
右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 系统变量 → 找到Path
→ 编辑 → 添加.dll所在目录(例如D:\mysql-connector-cpp\bin64
)。
注意:修改环境变量后需要重启 Visual Studio 才能生效。 -
方法3:通过项目属性指定(仅调试时生效)
项目属性 → 调试 → 环境 → 填写PATH=D:\mysql-connector-cpp\bin64;%PATH%
(替换为实际.dll目录)。
此方法仅在通过 Visual Studio 调试运行时有效,直接双击.exe运行时仍需.dll在同一目录或环境变量中。
三、为什么“看不到专门的.dll目录配置项”?
Visual Studio 中没有专门为.dll设置“目录配置”的选项(如“动态库目录”),因为:
- 编译链接阶段只需要导入库(.lib),无需.dll,因此只需配置.lib的目录。
- 运行阶段的.dll查找逻辑由 Windows 系统决定(优先.exe所在目录,再查环境变量
Path
等),而非 Visual Studio 项目配置。
总结
链接动态库时,需要配置两个关键路径:
- 编译链接阶段:通过 VC++ 目录 → 库目录(或链接器附加库目录)指定导入库(.lib)的目录。
- 运行阶段:通过复制.dll到.exe目录、添加环境变量
Path
等方式让系统找到.dll。
这两步缺一不可,否则会出现“链接错误(找不到.lib)”或“运行时错误(找不到.dll)”。
在 Visual Studio 中配置动态库或静态库时,链接器的“附加依赖项” 是告诉链接器“需要链接哪些具体库文件”的关键设置,其核心作用是明确指定项目依赖的库文件名,确保编译后的目标文件能与库文件正确关联,最终生成可执行程序。
为什么必须设置“附加依赖项”?
-
链接器需要明确知道“要链接哪些库”
即使你在“VC++ 目录 → 库目录”或“链接器 → 附加库目录”中配置了库文件所在的目录,链接器也只知道“去哪里找库”,但不知道“具体要找哪一个库”。
例如:MySQL Connector/C++ 的lib
目录下可能有多个库文件(如mysqlcppconn8.lib
、mysqlcppconn8d.lib
等),你必须通过“附加依赖项”指定具体用哪一个(如 Debug 模式选mysqlcppconn8d.lib
,Release 模式选mysqlcppconn8.lib
),否则链接器会找不到对应的函数实现,报“无法解析的外部符号”错误。 -
区分不同版本/功能的库
很多库会针对不同场景提供多个版本(如 Debug/Release 版本、带特定功能的版本),文件名通常有明确区分(如 Debug 版本带d
后缀)。
通过“附加依赖项”指定具体文件名,能精确匹配当前项目的配置(如 Debug 模式必须链接 Debug 版本的库,否则可能出现运行时异常)。 -
避免手动写链接指令
如果你不设置“附加依赖项”,也可以在代码中用#pragma comment(lib, "库文件名.lib")
指令指定要链接的库,但这种方式会将库依赖硬编码到代码中,不如在项目属性中配置灵活(例如切换 Debug/Release 时,属性配置可以自动切换对应的库,而代码无需修改)。
总结
“附加依赖项”的核心作用是明确告诉链接器需要链接的具体库文件名,与“库目录”配合使用:
- “库目录”解决“去哪里找库”的问题;
- “附加依赖项”解决“具体链接哪个库”的问题。
两者缺一不可,共同确保链接器能正确找到并关联所需的库文件,最终生成可执行程序。
配置流程
资源下载
进入官网MySQL下载官网
对应API下载地址
1. Debug 包
- 标识:明确标注了 Debug Binaries (调试二进制文件 )
- 名称:
Windows (x86, 64-bit), ZIP Archive Debug Binaries
- 文件名:
mysql-connector-c++-9.4.0-win64-debug.zip
这类包包含调试信息(如.pdb
文件 ),编译程序时选 Debug 配置可用,方便调试排查问题,但体积较大(69.5M )。
2. Release 包
剩下未标注 Debug Binaries
的是 Release 包:
Windows (x86, 64-bit), MSI Installer
:mysql-connector-c++-9.4.0-win64.msi
,是安装程序形式的 Release 包,用于生产环境部署,体积小(37.9M )。Windows (x86, 64-bit), ZIP Archive
:mysql-connector-c++-9.4.0-win64.zip
,是压缩包形式的 Release 包,无额外调试信息,体积适中(58.9M ),适合开发时直接解压配置 。
简单说,带 Debug Binaries
字样的是 Debug 包,另外两个是 Release 包,按需选:开发调试用 Debug 包,生产或常规开发用 Release 包 。
下载好后如图,注意三个目录:bin,include,lib64
VS项目配置
至于CMake项目,后面有空再写。
选中include目录
lib库目录同理
进入debug目录
然后进入里面的vs14目录
在 Debug 模式下,从你提供的 debug\vs14
目录里的库文件来看,需根据使用的 API (传统 JDBC 风格 API 还是 X DevAPI )来选:
1. 使用传统 JDBC 风格 API (旧版、兼容模式)
若代码里用的是类似 #include <mysql_driver.h>
这种基于 JDBC 风格的传统 API ,Debug 模式选 mysqlcppconn.lib
。
它是动态链接库(DLL)对应的导入库,编译时链接它,运行时需搭配同目录的 mysqlcppconn-xxx.dll
(需放到程序运行目录或系统 Path
里 )。
2. 使用 X DevAPI (新版、推荐)
若代码里用的是 #include <mysqlx/xdevapi.h>
这种 X DevAPI ,Debug 模式选 mysqlcppconnx.lib
。
同理,它是 X DevAPI 动态库的导入库,运行时依赖对应的 mysqlcppconnx-xxx.dll
。
3. 静态库(可选,但一般不用)
目录里的 mysqlcppconn-static.lib
和 mysqlcppconnx-static.lib
是静态库,会把库代码直接打包进你的程序。若想完全脱离 DLL 依赖,可选,但会让程序体积变大。
选静态库的话,Debug 模式对应选:
- 传统 API 静态库:
mysqlcppconn-static.lib
- X DevAPI 静态库:
mysqlcppconnx-static.lib
不过静态库使用时,可能还需额外配置编译选项(如处理运行时库一致性等),一般 Debug 调试阶段优先用动态库的 mysqlcppconn.lib
或 mysqlcppconnx.lib
更方便。
总结:
- 用传统 API →
mysqlcppconn.lib
- 用 X DevAPI →
mysqlcppconnx.lib
根据你代码里实际包含的头文件(mysql_driver.h
还是mysqlx/xdevapi.h
)选对应的 lib 填到附加依赖项即可。
库目录跟附加依赖项区别
库目录是 “范围”,附加依赖项是 “目标”,二者配合才能让链接器准确找到并链接所需的库文件。这就像你网购时,既需要填写收货地址(库目录),也需要填写具体商品名称(附加依赖项),少了任何一个都无法完成交易。
添加完设置后将bin目录下的.dll动态文件复制到x64下的debug目录里的跟.exe的同级目录。(如果是release就添加到对应的release目录下)
在 Debug 模式下,为了让程序运行时能找到动态库(.dll),需要把 bin 目录下的相关.dll 文件复制到可执行文件(.exe)的同级目录(也就是 x64\Debug
或 x64\Release
目录,与.exe 放一起)。背后的逻辑和具体原因可以拆解为以下几点:
1. 动态库(.dll)的工作原理
动态库(.dll)的特点是编译时只需要“导入库”(.lib),而运行时必须找到真正的.dll 文件。
- 编译阶段:链接器通过
.lib
(导入库)知道“有哪些函数可以调用”,但不包含实际函数的实现。 - 运行阶段:程序执行时,Windows 系统会去特定路径找
.dll
文件,加载其中的函数实现。
2. Windows 查找.dll 的顺序(必须让.dll 被找到)
Windows 加载.dll 的默认顺序是:
- 可执行文件(.exe)所在的目录(优先级最高)。
- 系统目录(
C:\Windows\System32
)。 - 系统环境变量
Path
中的目录。
如果不把.dll 放到.exe 同级目录,也可以通过修改系统 Path
或调试环境变量让程序找到,但最稳妥、最不容易出错的方式就是直接复制到.exe 同级目录(尤其是 Debug 调试阶段)。
3. 具体操作建议(Debug 模式)
-
复制.dll 到.exe 目录:
- 找到 MySQL Connector/C++ 的
bin
目录(或bin64
目录),里面的.dll
文件(如mysqlcppconnx-2-vs14.dll
、libcrypto-3-x64.dll
等)。 - 复制这些.dll 文件到你的项目生成目录(如
项目路径\x64\Debug
),与.exe 文件放在同一层。
- 找到 MySQL Connector/C++ 的
-
为什么推荐这么做?
- 避免环境变量干扰:修改系统
Path
可能影响其他程序,而复制到.exe 目录是“局部生效”,不污染全局环境。 - 调试更稳定:每次编译生成新的.exe 时,.dll 就在同一目录,无需反复修改环境变量。
- 避免环境变量干扰:修改系统
4. Release 模式的处理(可选)
- 如果是 Release 模式(最终发布程序),同样需要把.dll 复制到.exe 目录,或者打包到安装包中,确保用户运行时能找到。
- 也可以通过安装程序或脚本自动部署.dll,但 Debug 阶段直接复制是最简单的方式。
总结
在 Debug 模式下,必须把.dll 复制到.exe 同级目录(或通过其他方式让程序找到),否则运行时会报类似“找不到 xxx.dll”的错误。这一步和“库目录、附加依赖项”的配置是互补的:
- 库目录 + 附加依赖项 → 解决编译链接阶段的依赖。
- 复制.dll 到.exe 目录 → 解决运行阶段的依赖。
简单来说,就是“编译时靠.lib,运行时靠.dll”,二者缺一不可 。
代码测试
在测试代码前,一定要先启动mysql服务,同时保证有对应的数据库,我使用的是mysql额外附加的world数据库。
#include <jdbc/cppconn/statement.h>
#include <jdbc/cppconn/resultset.h>
#include <jdbc/cppconn/exception.h>
#include "jdbc/mysql_driver.h"
#include<windows.h>int main()
{std::string sql1 = "select * from city limit 10;";SetConsoleOutputCP(CP_UTF8);try{// 注册MySQL驱动程序sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance();sql::Connection* con;sql::Statement* stmt;sql::ResultSet* res;// 获取数据库连接对象con = driver->connect("tcp://localhost:3306", "root", "你自己的密码");con->setSchema("world"); // 设置要使用的数据库// 获取执行语句对象stmt = con->createStatement();res = stmt->executeQuery(sql1); // 使用 executeQuery 获取结果集// 输出列名std::cout << "ID, Name, CountryCode, District, Population" << std::endl;// 遍历结果集while (res->next()){// 获取各列的值并输出std::cout << "ID: " << res->getInt("ID")<< ", Name: " << res->getString("Name")<< ", CountryCode: " << res->getString("CountryCode")<< ", District: " << res->getString("District")<< ", Population: " << res->getInt("Population") << std::endl;}std::cout << "----------------------------------------" << std::endl;// 释放资源delete res;delete stmt;delete con;}catch (sql::SQLException& sqle){std::cout << "数据库连接出错啦,你是不是密码或者用户名写错了?或者你的数据库名称或者表名称写错了?" << std::endl;}return 0;
}
遇到的问题
第一次测试
忘给链接器添加库目录,一定要选vs14那个目录。
第二次遇到的问题
我也不知道怎么回事,在vs里粘贴没成功,后面用文件系统粘贴。
运行结果
参考文献
2025最新版VS2022配置C++ connector连接mysql(保姆级教学)