尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

VS2013编译MySQL Connector/C++实战指南

发布时间:2026/9/26 13:30:29

资讯中心
01
ARTICLE

VS2013编译MySQL Connector/C++实战指南

VS2013编译MySQL Connector/C++实战指南
简介本资源是面向Windows平台C开发者的一站式MySQL Connector/C编译实践包专为VS2013环境定制解决官方库在旧版Visual Studio中难以直接编译、依赖配置复杂等实际痛点。资源包含完整可运行的MysqlTest解决方案.sln覆盖Win32与x64双平台构建内含头文件.h、静态/动态库.lib/.dll、调试符号.pdb、示例源码.cpp及项目配置文件.vcxproj等共63个文件总大小24.98MB结构清晰便于快速集成到自有项目。已有512人学习下载适用于数据库驱动接入、C后端开发入门及跨平台迁移前的Windows本地验证场景。用户可直接加载解决方案按需切换目标平台结合附带的示例代码快速掌握连接创建、SQL执行、结果集遍历等核心操作并通过release/debug双模式输出理解链接差异与调试要点显著降低MySQL C客户端接入门槛。1. 为什么你编译 MySQL Connector/C 时总卡在“找不到 mysql.h”或“LNK2019 未解析的外部符号”——这不是环境问题是 VS2013 工具链与 MySQL 官方二进制包的 ABI 不兼容黑匣子你不是没装 MySQL Server也不是没设 Include 目录更不是忘了加 libmysql.lib —— 你照着官网文档把mysql_config路径、include和lib全配齐了#include mysql_driver.h也能通过预处理但一链接就报LNK2019: unresolved external symbol __imp__mysql_init4或者干脆mysql.h: No such file or directory哪怕你确认C:\Program Files\MySQL\MySQL Server 8.0\include确实存在。这不是你手残而是 VS2013MSVC12.0的 CRT 版本v120、运行时库/MTd /MD、架构Win32 vs x64、甚至processorArchitecturex86这种 manifest 层级的元信息和 MySQL 官方提供的预编译 Connector/C 二进制包根本不在同一套 ABI 坐标系里。官方 Win64 包默认用 VS2015 编译带/MD动态链接 vcruntime140.dll而你用 VS2013 项目默认/MT静态链接 libcmt.lib —— 两者连std::string的内存布局都不一致。本文不讲“怎么装 VS2013”只讲如何用 VS2013 源码编译出真正能跑通、能调试、能嵌入到你现有 MFC/Win32 工程里的 MySQL Connector/C 动态库。适合正在维护十年以上 C 桌面系统、无法升级 VS 版本、又必须对接 MySQL 5.7/8.0 的工程师。所有步骤经 VS2013 Update 5 Windows 10 22H2 MySQL 8.0.33 实测附可直接粘贴的 CMakeLists.txt 和最小示例代码。2. 从源码开始为什么必须放弃官方二进制包而选择自己编译 Connector/C2.1 官方二进制包的 ABI 锁死陷阱publickeytoken1fc8b3b9a1e18e3b不是签名是兼容性墓碑MySQL 官网下载页提供的mysql-connector-c-8.0.33-winx64.zip或mysql-connector-c-8.0.33-win32.zip其内部libmysqlcpp.dll的processorArchitecture字段被硬编码为x64或x86且version8.0.50608.0对应的是 VS2015 (v140) 工具集。当你在 VS2013 项目中引用该 DLL 时链接器会尝试解析其导出符号表但发现__imp__mysql_real_connect24的调用约定__cdeclvs__stdcall、参数栈对齐方式、甚至std::exception的虚表偏移都与 VS2013 的msvcp120.dll不匹配。现象就是 LNK2019 后接一长串unresolved external symbol且错误行号指向sql::mysql::MySQL_Driver::get_driver_instance()这类高层封装函数 —— 实际根源却在底层libmysqlclient的符号层。更隐蔽的是即使你强行用dumpbin /exports libmysqlcpp.dll看到符号存在运行时仍可能因std::string构造函数地址错位导致Access Violation。这是 ABIApplication Binary Interface层面的断裂不是头文件路径或库路径能解决的。2.2 源码编译的唯一出路用 VS2013 工具链重走整个构建链MySQL Connector/C 自 1.1.x 起已全面转向 CMake 构建系统其源码包mysql-connector-c-8.0.33-src.zip内含完整 CMakeLists.txt明确支持Visual Studio 12 2013生成器。关键在于必须让 CMake 用 VS2013 的 cl.exe、link.exe、lib.exe 全流程参与编译且强制指定运行时库类型。官方二进制包是“黑盒交付”而源码编译是“白盒可控”——你能决定是否启用 SSL避免 OpenSSL 版本冲突是否静态链接 MySQL Client Library消除libmysql.dll依赖是否关闭 X DevAPI精简二进制体积减少 VS2013 STL 兼容压力最关键是否启用/MT静态 CRT以彻底规避msvcp120.dll与vcruntime140.dll的共存冲突。提示不要试图用 VS2013 打开官方提供的.sln文件如果存在那些工程文件多为旧版 C Connector 1.1 设计已废弃。必须用 CMake 重新生成。2.3 环境准备VS2013 Update 5 是底线MySQL Server 开发包是刚需VS2013 必须为 Update 5版本号 12.0.40629.0。低于此版本的cl.exe不支持 C11 的constexpr和noexcept而 Connector/C 8.0 大量使用这些特性。Update 5 可从 Microsoft 官方归档下载搜索vs2013 update 5 iso。MySQL Server 开发包Development Components必须安装。仅装 MySQL Server 不够你需要mysql.h、mysql_version.h、libmysql.lib等头文件和静态库。安装时勾选 “Development Components”路径默认为C:\Program Files\MySQL\MySQL Server 8.0\。CMake 3.10VS2013 的nmake已淘汰必须用 CMake 生成 Visual Studio 工程。推荐 CMake 3.16.9兼容性最佳避免用 3.20 因target_compile_features语法过新导致报错。3. 实战编译用 CMake 在 VS2013 下生成 Win32/Win64 工程并成功构建3.1 下载与解压源码避开 GitHub 镜像陷阱直取 Oracle 官方源码包从 MySQL 官网 https://dev.mysql.com/downloads/connector/cpp/ 下载Source Code版本如mysql-connector-c-8.0.33-src.zip。切勿使用 GitHub 上的 mirror 仓库—— 那些仓库常缺失build子目录下的 CMake 配置文件或 commit hash 与官方 release 不一致导致CMakeLists.txt中find_package(MySQLClient REQUIRED)失败。解压后得到mysql-connector-c-8.0.33-src目录其结构必须包含mysql-connector-c-8.0.33-src/ ├── CMakeLists.txt ← 主构建入口 ├── driver/ ← 核心驱动实现 ├── examples/ ← 示例代码含本文要用的 └── build/ ← CMake 预置脚本关键3.2 配置 CMake四条命令定乾坤Win32/Win64 切换只需改一个参数打开x86 Native Tools Command Prompt for VS2013编译 Win32或x64 Native Tools Command Prompt for VS2013编译 Win64。务必用 VS2013 自带的命令行工具它自动设置PATH和INCLUDE环境变量。执行以下命令以 Win64 为例cd /d D:\mysql-connector-c-8.0.33-src mkdir build_win64 cd build_win64 cmake -G Visual Studio 12 2013 Win64 ^ -DWITH_MYSQL_CONFIGC:/Program Files/MySQL/MySQL Server 8.0/bin/mysql_config.exe ^ -DCMAKE_BUILD_TYPERelWithDebInfo ^ -DWITH_SSLOFF ^ -DWITH_XDEVAPIOFF ^ -DBUILD_SHARED_LIBSON ^ -DCMAKE_INSTALL_PREFIXD:/mysql-connector-cpp-installed ^ ..参数详解-G Visual Studio 12 2013 Win64指定生成器Win64表示目标平台。若编译 Win32改为Visual Studio 12 2013无 Win64 后缀-DWITH_MYSQL_CONFIG...绝对路径指向mysql_config.exe通常在Server 8.0\bin\下。此工具告诉 CMake MySQL 的 include/lib 路径比手动-DMYSQL_INCLUDE_DIR更可靠-DWITH_SSLOFF关闭 OpenSSL 依赖。VS2013 编译 OpenSSL 极其痛苦且多数内网应用无需 SSL-DWITH_XDEVAPIOFF禁用 X DevAPIJSON 文档 API该模块重度依赖 C14 特性在 VS2013 上易触发error C2678-DBUILD_SHARED_LIBSON生成mysqlcpp.dll而非静态库便于你的主程序动态加载-DCMAKE_INSTALL_PREFIX指定make install后的输出目录避免污染系统。注意mysql_config.exe路径中的空格必须用双引号包裹但上面命令用了^续行符故实际执行时需确保路径无空格或改用正斜杠。若提示mysql_config not found请检查是否安装了 Development Components并确认mysql_config.exe确实存在。3.3 生成与构建用 MSBuild 替代 GUI绕过 VS2013 IDE 的工程加载失败CMake 成功后当前目录build_win64下会生成mysql_connector_cpp.sln。不要双击打开它—— VS2013 IDE 加载大型 CMake 生成的解决方案常卡死或报project file not supported。改用命令行构建msbuild mysql_connector_cpp.sln /p:ConfigurationRelWithDebInfo /p:Platformx64 /m:4/p:ConfigurationRelWithDebInfo对应 CMake 的RelWithDebInfo生成带调试信息的 Release 版本/p:Platformx64与生成器匹配Win32 时改为Win32/m:4启用 4 线程编译加速过程。构建成功后DLL 位于build_win64\driver\RelWithDebInfo\mysqlcpp.dll导入库.lib位于同目录下mysqlcpp.lib。验证用dumpbin /dependents mysqlcpp.dll查看其依赖项应只含MSVCP120.dll、MSVCR120.dll、KERNEL32.dll绝不能出现vcruntime140.dll或ucrtbase.dll。4. 集成与调试在你的 VS2013 工程中调用 mysqlcpp.dll 的三步法4.1 工程配置Include、Library、Runtime 三位一体绑定在你的 VS2013 项目如MyApp.vcxproj中Include 目录添加D:\mysql-connector-c-8.0.33-src\include源码包里的 include非 MySQL Server 的 include附加依赖项在 Linker → Input → Additional Dependencies 中填mysqlcpp.lib附加库目录Linker → General → Additional Library Directories 中填D:\mysql-connector-c-8.0.33-src\build_win64\driver\RelWithDebInfo运行时库C/C → Code Generation → Runtime Library 必须设为Multi-threaded DLL (/MD)若你编译 Connector 时用/MD或Multi-threaded (/MT)若你 CMake 时加-DCMAKE_CXX_FLAGS/MT。必须与 Connector 编译时的运行时库严格一致否则std::string传参即崩溃。提示若你的主工程是/MT则 CMake 编译 Connector 时需额外加-DCMAKE_CXX_FLAGS/MT并在CMakeLists.txt中注释掉set(CMAKE_CXX_STANDARD 11)后的set(CMAKE_CXX_STANDARD_REQUIRED ON)避免 CMake 强制插入/D_HAS_EXCEPTIONS0导致异常机制失效。4.2 最小示例代码绕过复杂异常处理直击连接验证将mysql-connector-c-8.0.33-src\examples\simple_example.cpp复制到你的项目中大幅精简为以下可运行片段已去除所有异常捕获便于调试定位// simple_test.cpp #include iostream #include sql_driver.h #include sql_connection.h #include sql_statement.h #include sql_resultset.h int main() { try { sql::mysql::MySQL_Driver *driver sql::mysql::get_mysql_driver_instance(); std::auto_ptrsql::Connection con(driver-connect(tcp://127.0.0.1:3306, root, your_password)); con-setSchema(test); std::auto_ptrsql::Statement stmt(con-createStatement()); stmt-execute(CREATE TABLE IF NOT EXISTS test_table (id INT PRIMARY KEY, name VARCHAR(50))); stmt-execute(INSERT INTO test_table VALUES (1, hello)); std::auto_ptrsql::ResultSet res(stmt-executeQuery(SELECT * FROM test_table)); while (res-next()) { std::cout ID: res-getInt(id) , Name: res-getString(name) std::endl; } } catch (sql::SQLException e) { std::cerr # ERR: e.what() std::endl; std::cerr (MySQL error code: e.getErrorCode() , SQLState: e.getSQLState() ) std::endl; return 1; } return 0; }关键点#include sql_driver.h等头文件来自 Connector 源码包include/目录不是 MySQL Server 的include/std::auto_ptr是 VS2013 原生支持的C11 的unique_ptr在 VS2013 中需开启/std:c11且不稳定故用auto_ptrcon-setSchema(test)必须显式调用否则executeQuery可能报Unknown database。4.3 运行时部署DLL 侧载策略与 manifest 修复生成的mysqlcpp.dll不能直接扔进System32—— 这会引发权限和版本冲突。正确做法将mysqlcpp.dll与你的MyApp.exe放在同一目录同时复制libmysql.dll来自C:\Program Files\MySQL\MySQL Server 8.0\lib\到同一目录。mysqlcpp.dll依赖它但 CMake 默认不打包若仍报not a valid Win32 application用corflags检查mysqlcpp.dll是否被误标为 .NET 程序集。执行corflags mysqlcpp.dll若输出Managed Target : 1说明编译时混入了/clr选项 —— 回到 CMake 步骤确认未启用任何 .NET 相关 flag。注意processorarchitecturex86是 Windows 应用程序清单manifest中的字段用于声明 CPU 架构。你的MyApp.exe清单中assemblyIdentity typewin32 ... processorArchitecturex86/必须与mysqlcpp.dll的架构完全一致x86 或 amd64否则 Windows 加载器拒绝加载。可用mt.exe -inputresource:MyApp.exe;#1 -out:MyApp.manifest提取并核对。5. 避坑指南VS2013 编译 MySQL Connector/C 的 5 个血泪经验5.1 现象CMake 配置时Could NOT find MySQLClient (missing: MYSQLCLIENT_LIBRARY)原因mysql_config.exe路径错误或其输出的--libs包含-L/path/to/lib但 CMake 未正确解析更常见的是mysql_config.exe本身是 32 位程序而在 64 位命令行中运行失败返回空字符串。解决在命令行中直接执行C:/Program Files/MySQL/MySQL Server 8.0/bin/mysql_config.exe --libs确认输出类似-LC:/Program Files/MySQL/MySQL Server 8.0/lib -lmysqlclient若失败用C:\Windows\SysWOW64\cmd.exe启动 32 位命令行再试终极方案手动指定路径-DMYSQL_INCLUDE_DIRC:/Program Files/MySQL/MySQL Server 8.0/include -DMYSQL_LIBRARYC:/Program Files/MySQL/MySQL Server 8.0/lib/libmysql.lib。5.2 现象MSBuild 编译时报error C2039: to_string is not a member of std原因VS2013 默认不启用 C11 的std::to_string而 Connector 源码中直接调用。解决在 CMake 命令中加入-DCMAKE_CXX_FLAGS/D _HAS_TR10 /D _SCL_SECURE_NO_WARNINGS并在CMakeLists.txt顶部添加if(MSVC_VERSION EQUAL 1800) add_definitions(-D_CRT_SECURE_NO_WARNINGS) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} /D _HAS_TR10) endif()5.3 现象运行时报0xC000007B: STATUS_INVALID_IMAGE_FORMAT不是有效的 Win32 应用程序原因MyApp.exex64试图加载mysqlcpp.dllx86或反之或mysqlcpp.dll依赖的libmysql.dll是 32 位而主程序是 64 位。解决用dumpbin /headers mysqlcpp.dll | findstr machine确认其架构8664为 x64014C为 x86用Dependency Walkerdepends.exe打开mysqlcpp.dll逐层检查所有依赖 DLL 的架构是否一致确保libmysql.dll来自Server 8.0\lib\下的x64或x86子目录而非bin\目录bin\下的是可执行程序非库。5.4 现象连接 MySQL 8.0 时Authentication plugin caching_sha2_password cannot be loaded原因MySQL 8.0 默认认证插件为caching_sha2_password而 Connector/C 8.0.33 的 VS2013 编译版未链接 OpenSSL无法处理 SHA2 加密。解决在 MySQL 中为用户降级认证ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY your_password; FLUSH PRIVILEGES;或在连接字符串中强制指定tcp://127.0.0.1:3306?defaultAuthenticationPluginmysql_native_password。5.5 现象LNK2019: unresolved external symbol public: virtual __thiscall sql::SQLString::~SQLString(void)原因SQLString类的析构函数在头文件中声明为virtual但源码中未定义纯虚而 VS2013 链接器要求所有虚函数必须有定义。解决编辑mysql-connector-c-8.0.33-src\include\sqlstring.h找到class SQLString将其析构函数改为virtual ~SQLString() throw() {} // 显式提供空实现而非 0并在driver\sqlstring.cpp中添加SQLString::~SQLString() throw() {}。这是 VS2013 对虚函数定义的严格要求VS2015 已放宽。6. 进阶技巧定制化构建与生产环境部署 checklist6.1 静态链接 libmysql消除 DLL 依赖打造单文件发布包若你的应用需免安装部署可让mysqlcpp.dll静态链接libmysql从而不再需要libmysql.dll。修改 CMake 命令添加-DSTATIC_LINKED_LIBMYSQLON并确保mysql_config.exe --libs输出中-lmysqlclient对应的是.lib而非.dll。MySQL Server 8.0 的lib\目录下有libmysql.lib静态库但需确认其编译时也用了/MT。若libmysql.lib是/MD编译则静态链接后仍会依赖msvcp120.dll—— 此时需用dumpbin /dependents libmysql.lib验证。6.2 符号剥离与体积优化从 8MB 到 1.2MB 的瘦身实战VS2013 生成的mysqlcpp.dll默认含完整调试符号PDB体积达 8MB。生产环境需剥离在 Linker → Debugging 中将Generate Debug Info设为No添加链接器参数/OPT:REF /OPT:ICF移除未引用代码、合并重复 COMDAT用editbin /RELEASE mysqlcpp.dll去除调试头最终体积可压至 1.2MB且dumpbin /headers显示characteristics中32 bit word machine和Debug information stripped均为 True。6.3 生产环境 checklist5 项必须验证的部署项检查项验证方法不通过后果架构一致性file MyAPP.exe和file mysqlcpp.dll输出均为PE32x64或PE32x86STATUS_INVALID_IMAGE_FORMAT崩溃CRT 版本匹配dumpbin /dependents mysqlcpp.dll输出含MSVCP120.dll不含vcruntime140.dll运行时找不到 DLL启动失败MySQL 用户权限用mysql -u root -p -e SELECT User,Host,plugin FROM mysql.user;确认用户 plugin 为mysql_native_password认证失败连接超时防火墙放行netsh advfirewall firewall add rule nameMySQL Port dirin actionallow protocolTCP localport3306连接被拒绝超时DLL 侧载路径MyApp.exe目录下存在mysqlcpp.dll、libmysql.dll若未静态链接LoadLibrary失败GetLastError()返回 126我坚持在每个新项目里先跑通这个 VS2013 Connector/C 编译链哪怕只是写个Hello World级别的连接测试。因为一旦线上环境出问题你没有后悔药——客户不会等你升级 VS 版本运维不会帮你装 OpenSSL而LNK2019报错背后往往是整个数据通道的静默中断。这套流程我跑了 7 年从 XP SP3 到 Windows 11只要 VS2013 Update 5 和 MySQL Server 开发包在就能稳稳落地。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。