You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Connector C++ 8.0连接MySQL服务器时遇C++链接错误求助

解决MinGW链接VS编译的MySQL Connector/C++库出现的未定义引用错误

问题描述

我是C++新手,尝试连接MySQL/MariaDB数据库,写了以下代码:

#include <mysql_connection.h>
#include <cppconn/driver.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

int main() {
    sql::Driver *driver;
    sql::Connection *con;
    driver = get_driver_instance();
    con = driver->connect("tcp://127.0.0.1:3306", "root", "");
    delete con;
    
    return 0;
}

CMake脚本如下:

cmake_minimum_required(VERSION 3.24)
project(patil_clustering_c)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR "C:\Program Files (x86)\MySQL\Connector C++ 8.0")

add_executable(patil_clustering_c main.cpp)

# Add the MySQL include directories to this target.
target_include_directories(patil_clustering_c PRIVATE
        ${FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR}/include/jdbc
        )
target_include_directories(patil_clustering_c PRIVATE
        ${FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR}/include/jdbc/cppconn
        )

# Link the MySQL library to your executable.
target_link_libraries(patil_clustering_c PRIVATE
        ${FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR}/lib/vs14/mysqlcppconn8.lib
        )

编译时出现以下链接错误:

====================[ Build | patil_clustering_c | Debug ]======================
C:\Users\danie\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\223.8836.42\bin\cmake\win\x64\bin\cmake.exe --build C:\Users\danie\Documents\projecten\patil-clustering-c\cmake-build-debug --target patil_clustering_c -j 9
[1/2] Building CXX object CMakeFiles/patil_clustering_c.dir/main.cpp.obj
[2/2] Linking CXX executable patil_clustering_c.exe
FAILED: patil_clustering_c.exe 
cmd.exe /C "cd . && C:\Users\danie\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\223.8836.42\bin\mingw\bin\g++.exe -g  CMakeFiles/patil_clustering_c.dir/main.cpp.obj -o patil_clustering_c.exe -Wl,--out-implib,libpatil_clustering_c.dll.a -Wl,--major-image-version,0,--minor-image-version,0  "C:/Program Files (x86)/MySQL/Connector C++ 8.0/lib/vs14/mysqlcppconn8.lib"  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
C:\Users\danie\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\223.8836.42\bin\mingw\bin/ld.exe: CMakeFiles/patil_clustering_c.dir/main.cpp.obj:C:/Program Files (x86)/MySQL/Connector C++ 8.0/include/jdbc/cppconn/driver.h:82: undefined reference to `check(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
C:\Users\danie\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\223.8836.42\bin\mingw\bin/ld.exe: CMakeFiles/patil_clustering_c.dir/main.cpp.obj: in function `check_lib':
C:/Program Files (x86)/MySQL/Connector C++ 8.0/include/jdbc/cppconn/driver.h:83: undefined reference to `check(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&)'
C:\Users\danie\AppData\Local\JetBrains\Toolbox\apps\CLion\ch-0\223.8836.42\bin\mingw\bin/ld.exe: CMakeFiles/patil_clustering_c.dir/main.cpp.obj:C:/Program Files (x86)/MySQL/Connector C++ 8.0/include/jdbc/cppconn/driver.h:95: undefined reference to `_get_driver_instance_by_name'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

解决方法

1. 核心问题:编译器ABI不兼容

你现在链接的是Visual Studio 2015(vs14)编译的mysqlcppconn8.lib,但使用的是MinGW编译器。VS和MinGW的C++ ABI(应用二进制接口)不兼容,导致链接时无法找到正确的函数实现,出现未定义引用错误。

2. 具体修复步骤

步骤1:获取MinGW兼容的MySQL Connector/C++库

  • 前往MySQL官方下载页面,选择针对MinGW编译的Connector/C++ 8.0版本,注意匹配你的MinGW是32位还是64位,以及编译器版本(比如gcc 11.x/12.x)。
  • 如果官网没有现成的预编译MinGW库,可以自己从Connector/C++源码编译:用MinGW工具链配置CMake,编译出libmysqlcppconn8.a或对应的动态库导入库。

步骤2:修正CMake脚本

假设你已经下载/编译好MinGW版本的库,更新CMake脚本如下:

cmake_minimum_required(VERSION 3.24)
project(patil_clustering_c)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 替换为MinGW版Connector/C++的路径
set(FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR "你的MinGW版Connector路径")

add_executable(patil_clustering_c main.cpp)

# 只需要包含jdbc目录即可,cppconn是其子目录,会被自动查找
target_include_directories(patil_clustering_c PRIVATE
        ${FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR}/include/jdbc
        )

# 链接MinGW版本的库,比如静态库libmysqlcppconn8.a或者动态库的导入库
target_link_libraries(patil_clustering_c PRIVATE
        ${FULL_PATH_TO_MYSQL_CONNECTOR_CPP_DIR}/lib/libmysqlcppconn8.a
        )

步骤3:运行时注意事项

如果使用动态库,需要把Connector/C++对应的libmysqlcppconn8.dll文件放到你的可执行文件patil_clustering_c.exe同目录下,或者加入系统环境变量PATH,否则运行时会提示找不到动态库。

内容的提问来源于stack exchange,提问作者DanielvdSpoel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:58:08