当前位置: 首页 > news >正文

如何在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++。

  1. 安装MySQL Connector/C++:从MySQL官方网站下载适合的版本(https://dev.mysql.com/downloads/connector/cpp/),下载完成后解压到指定目录。
  2. 配置项目属性
    • 包含目录:右键点击项目,选择“属性”,在“配置属性” -> “VC++ 目录” -> “包含目录”中,添加MySQL Connector/C++解压目录下的include文件夹路径,让编译器能够找到相关的头文件。
    • 库目录:在“配置属性” -> “VC++ 目录” -> “库目录”中,添加解压目录下的lib文件夹路径(根据你的平台是x86还是x64,选择对应的lib文件夹),以便链接器找到库文件。
    • 附加依赖项:在“配置属性” -> “链接器” -> “输入” -> “附加依赖项”中,根据你使用的是Debug还是Release配置,添加对应的库文件(例如mysqlcppconn.libmysqlcppconnd.lib)。
    • 动态链接库(DLL):将解压目录下bin文件夹中的相关DLL文件(如mysqlcppconn8-2-vs14.dll )复制到项目的可执行文件所在目录,或者将bin目录添加到系统的PATH环境变量中,确保运行时能够找到这些DLL。

在 Visual Studio Code 中使用

Visual Studio Code是一个轻量级、跨平台的代码编辑器,结合C++扩展和CMake等工具可以实现对MySQL Connector/C++的使用。

  1. 安装必要的扩展:在VS Code中安装“C/C++”扩展,用于提供C++语言的支持。
  2. 安装MySQL Connector/C++:与在Visual Studio中一样,从官方网站下载并解压。
  3. 配置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++。

  1. 安装MySQL Connector/C++:可以通过包管理器安装(如果有对应的包),或者从官方网站下载源码进行编译安装。例如,在Debian/Ubuntu系统中可以尝试以下命令安装(如果存在对应版本的包):
sudo apt-get install libmysqlcppconn-dev
  1. 配置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\Debugx64\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 项目配置。

总结

链接动态库时,需要配置两个关键路径:

  1. 编译链接阶段:通过 VC++ 目录 → 库目录(或链接器附加库目录)指定导入库(.lib)的目录。
  2. 运行阶段:通过复制.dll到.exe目录、添加环境变量 Path 等方式让系统找到.dll。

这两步缺一不可,否则会出现“链接错误(找不到.lib)”或“运行时错误(找不到.dll)”。

在 Visual Studio 中配置动态库或静态库时,链接器的“附加依赖项” 是告诉链接器“需要链接哪些具体库文件”的关键设置,其核心作用是明确指定项目依赖的库文件名,确保编译后的目标文件能与库文件正确关联,最终生成可执行程序。

为什么必须设置“附加依赖项”?

  1. 链接器需要明确知道“要链接哪些库”
    即使你在“VC++ 目录 → 库目录”或“链接器 → 附加库目录”中配置了库文件所在的目录,链接器也只知道“去哪里找库”,但不知道“具体要找哪一个库”。
    例如:MySQL Connector/C++ 的 lib 目录下可能有多个库文件(如 mysqlcppconn8.libmysqlcppconn8d.lib 等),你必须通过“附加依赖项”指定具体用哪一个(如 Debug 模式选 mysqlcppconn8d.lib,Release 模式选 mysqlcppconn8.lib),否则链接器会找不到对应的函数实现,报“无法解析的外部符号”错误。

  2. 区分不同版本/功能的库
    很多库会针对不同场景提供多个版本(如 Debug/Release 版本、带特定功能的版本),文件名通常有明确区分(如 Debug 版本带 d 后缀)。
    通过“附加依赖项”指定具体文件名,能精确匹配当前项目的配置(如 Debug 模式必须链接 Debug 版本的库,否则可能出现运行时异常)。

  3. 避免手动写链接指令
    如果你不设置“附加依赖项”,也可以在代码中用 #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 Installermysql-connector-c++-9.4.0-win64.msi ,是安装程序形式的 Release 包,用于生产环境部署,体积小(37.9M )。
  • Windows (x86, 64-bit), ZIP Archivemysql-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.libmysqlcppconnx-static.lib静态库,会把库代码直接打包进你的程序。若想完全脱离 DLL 依赖,可选,但会让程序体积变大。

选静态库的话,Debug 模式对应选:

  • 传统 API 静态库:mysqlcppconn-static.lib
  • X DevAPI 静态库:mysqlcppconnx-static.lib

不过静态库使用时,可能还需额外配置编译选项(如处理运行时库一致性等),一般 Debug 调试阶段优先用动态库的 mysqlcppconn.libmysqlcppconnx.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\Debugx64\Release 目录,与.exe 放一起)。背后的逻辑和具体原因可以拆解为以下几点:

1. 动态库(.dll)的工作原理

动态库(.dll)的特点是编译时只需要“导入库”(.lib),而运行时必须找到真正的.dll 文件

  • 编译阶段:链接器通过 .lib(导入库)知道“有哪些函数可以调用”,但不包含实际函数的实现。
  • 运行阶段:程序执行时,Windows 系统会去特定路径找 .dll 文件,加载其中的函数实现。

2. Windows 查找.dll 的顺序(必须让.dll 被找到)

Windows 加载.dll 的默认顺序是:

  1. 可执行文件(.exe)所在的目录(优先级最高)。
  2. 系统目录(C:\Windows\System32)。
  3. 系统环境变量 Path 中的目录。

如果不把.dll 放到.exe 同级目录,也可以通过修改系统 Path 或调试环境变量让程序找到,但最稳妥、最不容易出错的方式就是直接复制到.exe 同级目录(尤其是 Debug 调试阶段)。

3. 具体操作建议(Debug 模式)

  1. 复制.dll 到.exe 目录

    • 找到 MySQL Connector/C++ 的 bin 目录(或 bin64 目录),里面的 .dll 文件(如 mysqlcppconnx-2-vs14.dlllibcrypto-3-x64.dll 等)。
    • 复制这些.dll 文件到你的项目生成目录(如 项目路径\x64\Debug),与.exe 文件放在同一层。
  2. 为什么推荐这么做?

    • 避免环境变量干扰:修改系统 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(保姆级教学)

http://www.lryc.cn/news/619765.html

相关文章:

  • 如何把ubuntu 22.04下安装的mysql 8 的 数据目录迁移到另一个磁盘目录
  • 设计模式笔记_行为型_策略模式
  • OpenJDK 17 源码 安全点轮询的信号处理流程
  • 资源查看-lspci命令
  • 如何准备一场技术演讲
  • 各种排序算法(二)
  • 磁悬浮轴承转子设计避坑指南:深度解析核心要点与高可靠性策略
  • 基于js和html的点名应用
  • 【电气】NPN与PNP
  • B系列树详细讲解
  • 16-docker的容器监控方案-prometheus实战篇
  • Python 类元编程(导入时和运行时比较)
  • Windows也能用!Claude Code硬核指南
  • [激光原理与应用-259]:理论 - 几何光学 - 平面镜的反射、平面透镜的折射、平面镜的反射成像、平面透镜的成像的规律
  • 网刻软件iVentoy软件使用方法
  • @进程管理工具 - Glances工具详细指南
  • Django REST Framework视图
  • Java 大视界 -- Java 大数据机器学习模型在金融资产配置优化与风险收益平衡中的应用(395)
  • 解惑rust中的 Send/Sync(译)
  • 基于Java的Markdown转Word工具(标题、段落、表格、Echarts图等)
  • 18.10 SQuAD数据集实战:5步高效获取与预处理,BERT微调避坑指南
  • 实战多屏Wallpaper壁纸显示及出现黑屏问题bug分析-学员作业
  • HTML <iframe> 标签 如何把html写入iframe标签
  • 版图设计学习2_掌握PDK中的层定义(工艺文档精读)
  • Spring Boot 集成 机器人指令中枢ROS2工业机械臂控制网关
  • 如何在 Spring Boot 中设计和返回树形结构的组织和部门信息
  • 大致计算服务器磁盘使用情况脚本
  • GNhao/GN号,海外SIM号怎么获取的步骤指南
  • npm install 的作用
  • Android实现Glide/Coil样式图/视频加载框架,Kotlin