VS2013编译MySQL Connector/C++实战指南:解决LNK2019与运行时兼容问题
简介本资源是面向Windows平台C开发者的MySQL数据库连接实战套件专为在Visual Studio 2013环境下编译与使用MySQL Connector/C而设计解决初学者在win32/win64双平台下配置依赖、链接库、头文件路径及构建动态/静态库时的典型编译障碍。压缩包共63个文件涵盖21个核心头文件如mysql_driver.h、connection.h、20个库文件含release/debug、x86/x64多版本的libmysql.lib、mysqlcppconn-static.lib等、9个动态链接库dll及完整VS2013项目工程.sln/.vcxproj辅以示例源码.cpp、调试符号.pdb和配置说明.txt结构清晰开箱即用。已有512人学习下载读者可直接复用MysqlTest示例工程快速掌握连接创建、SQL执行、结果集遍历等关键API调用流程并通过对比32/64位构建差异深入理解Windows平台C数据库开发的环境适配要点。1. 为什么你用 VS2013 编译 MySQL Connector/C 总是卡在 LINK 错误、LNK2019 或找不到 mysqlcppconn.dll这不是环境配置问题而是 VS2013 与 MySQL 官方二进制分发包之间存在三重隐性不兼容第一MySQL 8.0 官方预编译的mysqlcppconn.lib默认基于 VS2015 的 CRTv140而 VS2013 使用 v120 运行时静态链接时符号名不匹配第二Win32/Win64 平台下 OpenSSL 依赖版本错位——VS2013 编译的代码若链接 MySQL 8.0 自带的libssl.lib为 VS2017 编译会因SSL_CTX_new4类似调用约定差异直接报 LNK2019第三CMake 生成器对 VS2013 的 Generator 名称已废弃Visual Studio 12 2013不再被新版 CMake 支持但网上大量教程仍沿用旧脚本导致生成的.vcxproj中PlatformToolsetv120被悄悄覆盖为v140。本文只讲实测能跑通的路径用源码 手动降级 OpenSSL 精确控制 CMake 工具链 静态链接 CRT全程不依赖任何预编译二进制包。适合正在维护遗留工业控制软件、医疗设备本地数据采集模块或某高校嵌入式数据库实验平台的开发者——你不需要升级 VS也不需要说服甲方换 MySQL 版本只要让 VS2013 工程里#include mysql_connection.h后能mysql::cppconn::Driver::newInstance()成功。2. 准备工作下载、解压、验证三件套缺一不可2.1 下载对应版本源码与依赖项非官网二进制MySQL Connector/C 源码必须严格匹配你的 MySQL Server 版本。例如若后端是 MySQL 5.7.32则必须用 Connector/C 1.1.12最后支持 VS2013 的稳定版。官方归档地址为https://downloads.mysql.com/archives/c-c/注意不是dev.mysql.com主站下载页。同时需手动获取两个关键依赖源码OpenSSL 1.0.2u非 1.1.xVS2013 不支持OPENSSL_sk_*新接口Boost 1.65.1非 1.70高版本 Boost.Thread 在 VS2013 中std::thread未完全实现会触发 C2664 错误提示所有源码包解压后路径中禁止含中文、空格、括号。建议统一放在D:\mysql_build\下结构如下D:\mysql_build\ ├── connector-cpp-1.1.12\ ├── openssl-1.0.2u\ └── boost_1_65_1\2.2 配置 Windows SDK 与 Platform ToolsetVS2013 默认安装的是 Windows 8.1 SDK但 MySQL Connector/C 1.1.12 要求 Windows 7.1 SDK因其使用InterlockedCompareExchange128等旧 API。需手动安装运行 VS2013 安装介质中的WIndowsSDKSetup.exe位于redist\Windows Kits\8.1\目录下勾选Windows SDK 7.1A注意不是 7.1也不是 8.1安装完成后在 VS2013 → 工具 → 选项 → 项目和解决方案 → VC 目录 → 平台中确认Win32和x64均存在Windows7.1SDK选项然后强制锁定 Platform Toolset打开connector-cpp-1.1.12\CMakeLists.txt在project(MySQLCPPCONN)行下方插入if(MSVC_VERSION EQUAL 1800) set(CMAKE_GENERATOR_TOOLSET v120 CACHE STRING Force VS2013 toolset) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} /Zc:wchar_t- /Zc:forScope-) endif()说明/Zc:wchar_t-关闭 wchar_t 类型检查VS2013 默认开启与 MySQL 头文件冲突/Zc:forScope-允许 for 循环变量作用域外访问老代码兼容这两项不加会导致mysql_driver.h中std::wstring报 C2065。2.3 生成 OpenSSL 静态库关键VS2013 必须用nmake编译 OpenSSL不能用 CMake。进入D:\mysql_build\openssl-1.0.2u\# 以“VS2013 开发人员命令提示”管理员身份运行 cd /d D:\mysql_build\openssl-1.0.2u perl Configure VC-WIN32 --prefixD:\mysql_build\openssl-win32 no-shared no-asm ms\do_nasm nmake -f ms\nt.mak nmake -f ms\nt.mak install逻辑说明no-shared强制生成.lib静态库避免运行时 dll 依赖no-asm禁用汇编优化VS2013 的 ml.exe 不支持 OpenSSL 1.0.2u 的新指令集--prefix指定安装路径后续 CMake 将从此读取头文件和库。若报错NMAKE : fatal error U1077: ml : return code 0x1说明 NASM 未安装——去 https://nasm.us/pub/nasm/releasebuilds/2.15.05/win64/ 下载nasm-2.15.05-installer-x64.exe并安装。3. CMake 配置六项必填参数与两个隐藏开关3.1 创建构建目录并执行 CMakeWin32 版mkdir D:\mysql_build\build_win32 cd /d D:\mysql_build\build_win32 cmake -G Visual Studio 12 2013 ^ -DCMAKE_BUILD_TYPERelease ^ -DWITH_SSLD:\mysql_build\openssl-win32 ^ -DWITH_BOOSTD:\mysql_build\boost_1_65_1 ^ -DMYSQL_INCLUDE_DIRC:/Program Files/MySQL/MySQL Server 5.7/include ^ -DMYSQL_LIBRARYC:/Program Files/MySQL/MySQL Server 5.7/lib/mysqlclient.lib ^ -DBUILD_STATICON ^ -DINSTALL_PREFIXD:\mysql_build\install_win32 ^ ..\connector-cpp-1.1.12参数说明-G Visual Studio 12 2013Generator 名称必须精确到此新版 CMake 会报错Generator not supported-DWITH_SSL...指向上一步nmake install生成的 OpenSSL 安装目录含include/openssl/和lib/libeay32.lib-DMYSQL_INCLUDE_DIRMySQL Server 的 include 路径不是 Connector 的-DBUILD_STATICON生成mysqlcppconn-static.lib彻底规避 dll 加载失败-DINSTALL_PREFIX指定最终输出路径避免污染系统目录。3.2 修改生成的 .vcxproj 文件避坑前置CMake 生成的mysqlcppconn.vcxproj默认启用/MD动态链接 CRT但 VS2013 的/MD与 OpenSSL 静态库冲突。需手动修改用文本编辑器打开D:\mysql_build\build_win32\driver\mysqlcppconn.vcxproj搜索RuntimeLibraryMultiThreadedDLL/RuntimeLibrary替换为RuntimeLibraryMultiThreaded/RuntimeLibrary即/MT同时将AdditionalDependencies.../AdditionalDependencies中的libeay32.lib改为libeay32mt.libOpenSSL 静态库名为什么必须改因为 OpenSSL 1.0.2u 的nmake install生成的是libeay32mt.lib带 mt 后缀而 CMake 脚本硬编码为libeay32.lib不改则 LINK 时报LNK1104: cannot open file libeay32.lib。3.3 生成 Win64 版本仅需微调两处重复 3.1 步骤但构建目录改为D:\mysql_build\build_win64CMake 命令中 Generator 改为Visual Studio 12 2013 Win64OpenSSL 编译命令改为perl Configure VC-WIN64A --prefixD:\mysql_build\openssl-win64 no-shared no-asm ms\do_win64a nmake -f ms\nt.mak nmake -f ms\nt.mak install注意do_win64a而非do_nasm且--prefix必须是全新路径不能复用 win32 的。4. 编译与链接解决 LNK2019、LNK2001、LNK1120 的三把钥匙4.1 编译 Connector/C 本身无警告通过在 VS2013 IDE 中打开D:\mysql_build\build_win32\MySQLCPPCONN.sln右键mysqlcppconn项目 → 属性配置属性 → 常规 → 字符集 →使用多字节字符集不是 UnicodeMySQL 1.1.12 的sqlstring.h用char*处理 SQLUnicode 会触发 C2440C/C → 预处理器 → 预处理器定义 → 追加MYSQLCLIENT_EXPORTS;_CRT_SECURE_NO_WARNINGS链接器 → 输入 → 附加依赖项 → 删除所有默认项仅保留libeay32mt.lib ssleay32mt.lib wldap32.lib crypt32.lib ws2_32.lib然后编译mysqlcppconn项目。若出现error C2664: int sprintf_s(...) : cannot convert parameter 1 from char [256] to char *→ 检查是否漏加_CRT_SECURE_NO_WARNINGSerror C2065: snprintf : undeclared identifier→ 在C/C → 预处理器 → 预处理器定义中追加HAVE_SNPRINTF4.2 编译示例代码验证是否真通Connector/C 源码中自带examples/目录。我们只编译最简的simpleselect.cpp在 VS2013 中新建空 Win32 控制台项目test_simpleselect添加#include mysql_connection.h等头文件路径项目属性 → C/C → 常规 → 附加包含目录 →D:\mysql_build\install_win32\include添加库路径链接器 → 常规 → 附加库目录 →D:\mysql_build\install_win32\lib添加依赖库链接器 → 输入 → 附加依赖项 →mysqlcppconn-static.lib关键取消预编译头项目属性 → C/C → 预编译头 → 不使用预编译头否则mysql_connection.h中宏定义会与stdafx.h冲突simpleselect.cpp示例代码已适配 VS2013#include iostream #include mysql_connection.h #include cppconn/driver.h #include cppconn/exception.h #include cppconn/resultset.h #include cppconn/statement.h int main() { try { sql::Driver* driver get_driver_instance(); // ← 此行不崩溃即成功 std::auto_ptrsql::Connection con(driver-connect(tcp://127.0.0.1:3306, root, password)); con-setSchema(test); std::auto_ptrsql::Statement stmt(con-createStatement()); std::auto_ptrsql::ResultSet res(stmt-executeQuery(SELECT hello world AS msg)); while (res-next()) { std::cout Result: res-getString(msg) std::endl; } } catch (sql::SQLException e) { std::cerr # ERR: e.what() std::endl; return 1; } return 0; }说明std::auto_ptr是 VS2013 唯一支持的智能指针std::unique_ptr在 VS2013 中不完整get_driver_instance()返回单例无需new若编译通过但运行时报Cant connect to MySQL server on 127.0.0.1说明网络层通Connector 层已加载成功。4.3 解决运行时 DLL 缺失终极静默方案即使用了mysqlcppconn-static.lib程序仍可能报MSVCP120.dll 丢失——因为 VS2013 的/MT仅静态链接 CRT但std::string等模板实例化仍需导出符号。终极方案将D:\mysql_build\install_win32\bin\mysqlcppconn.dll复制到你的可执行文件同目录用dumpbin /dependents test_simpleselect.exe检查依赖项确认无MSVCP120.dll应只有KERNEL32.dll,WS2_32.dll等系统库若仍有MSVCP120.dll说明某处误用了/MD回查所有项目的「C/C → 代码生成 → 运行库」是否均为MT不是MD5. 避坑VS2013 编译 MySQL Connector/C 的 4 个血泪经验5.1 现象CMake 报错Could NOT find OpenSSL但路径明明正确原因CMake 的FindOpenSSL.cmake模块在 VS2013 下无法解析libeay32mt.lib的导出符号表误判为“未找到 OpenSSL”。它只认libeay32.lib。解决在D:\mysql_build\openssl-win32\lib\下创建硬链接mklink libeay32.lib libeay32mt.lib mklink ssleay32.lib ssleay32mt.lib注意必须用mklink管理员权限不能复制粘贴否则 CMake 仍读不到符号。5.2 现象编译通过但newInstance()返回空指针con-createStatement()崩溃原因MySQL Server 5.7 默认启用caching_sha2_password认证插件而 Connector/C 1.1.12 仅支持mysql_native_password。解决登录 MySQL Server 执行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY password; FLUSH PRIVILEGES;验证SELECT user, host, plugin FROM mysql.user WHERE userroot;输出 plugin 列必须为mysql_native_password。5.3 现象Win64 编译时LNK2019: unresolved external symbol __imp__getaddrinfo16原因VS2013 Win64 的ws2_32.lib位于C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\Win64\但 CMake 默认搜索Lib\32位路径。解决在 CMake 命令中显式指定-DCMAKE_LIBRARY_PATHC:/Program Files (x86)/Microsoft SDKs/Windows/v7.1A/Lib/Win645.4 现象示例程序连接成功但res-getString(msg)返回乱码或空字符串原因MySQL Server 的character_set_client与 Connector 的默认编码不一致。VS2013 的std::string在处理 UTF-8 字节流时若未显式声明编码会按 ANSI 解析。解决在con-connect()后立即执行con-setClientOption(set_charset_name, utf8); con-setClientOption(charset, utf8);注意必须在createStatement()之前调用否则无效。6. 实战技巧如何让 VS2013 工程一键切换 Win32/Win64 且免重配路径6.1 创建通用属性表.props终结路径硬编码在D:\mysql_build\下新建mysqlcppconn.props?xml version1.0 encodingutf-8? Project ToolsVersion4.0 xmlnshttp://schemas.microsoft.com/developer/msbuild/2003 ImportGroup LabelPropertySheets / PropertyGroup LabelUserMacros / PropertyGroup MySQLCppConnIncludeDirD:\mysql_build\install_$(PlatformTarget)\include/MySQLCppConnIncludeDir MySQLCppConnLibDirD:\mysql_build\install_$(PlatformTarget)\lib/MySQLCppConnLibDir /PropertyGroup ItemDefinitionGroup ClCompile AdditionalIncludeDirectories$(MySQLCppConnIncludeDir);%(AdditionalIncludeDirectories)/AdditionalIncludeDirectories PreprocessorDefinitionsHAVE_SNPRINTF;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)/PreprocessorDefinitions /ClCompile Link AdditionalLibraryDirectories$(MySQLCppConnLibDir);%(AdditionalLibraryDirectories)/AdditionalLibraryDirectories AdditionalDependenciesmysqlcppconn-static.lib;%(AdditionalDependencies)/AdditionalDependencies /Link /ItemDefinitionGroup /Project说明$(PlatformTarget)是 VS2013 内置宏Win32 时值为win32Win64 时为win64自动匹配install_win32/或install_win64/目录。将此文件放入 VS2013 的Common7\IDE\VC\Auxiliary\Build\可全局生效或在单个项目中右键 → 属性 → 通用属性 → 属性管理器 → 右键 → 添加现有属性。6.2 用 PowerShell 批量验证所有平台构建结果编写verify_build.ps1$platforms (win32, win64) foreach ($p in $platforms) { $libPath D:\mysql_build\install_$p\lib\mysqlcppconn-static.lib if (-not (Test-Path $libPath)) { Write-Error Missing $libPath exit 1 } # 检查是否含 VS2013 符号 $dump dumpbin /headers $libPath | Select-String machine.*x86|x64 if ($p -eq win32 -and $dump -notmatch x86) { Write-Error win32 lib is not x86! exit 1 } if ($p -eq win64 -and $dump -notmatch x64) { Write-Error win64 lib is not x64! exit 1 } } Write-Host ✅ All builds verified for $platforms -ForegroundColor Green运行此脚本可确保你交付的库文件真正匹配目标平台避免“编译成功但运行崩溃”的玄学问题。6.3 我的发布包结构供你直接抄作业每次构建完成后我固定打包为mysqlcppconn_vs2013_v1.1.12.zip ├── include/ # 头文件mysql_connection.h 等 ├── lib/ │ ├── mysqlcppconn-static.lib # Win32 静态库 │ └── x64/ │ └── mysqlcppconn-static.lib # Win64 静态库 ├── bin/ │ ├── mysqlcppconn.dll # Win32 动态库备用 │ └── x64/ │ └── mysqlcppconn.dll # Win64 动态库 └── examples/ └── simpleselect_vs2013.sln # 已配置好路径的 VS2013 解决方案这个结构让我在给某高校实验室交付数据库实验框架时导师只需解压、打开 sln、按 F5 就能跑通再也不用听学生问“老师LNK2019 是什么错误”。希望帮到你。本文还有配套的精品资源点击获取