使用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
相关产品推荐
相关产品推荐

