C++连接MySQL数据库遇未定义引用错误:undefined reference to `check(std::map...)`
问题详情
已成功引入MySQL Connector C++ 9.0的头文件,但编译时触发链接错误:
C:\Program Files\JetBrains\CLion 2023.3.2\bin\mingw\bin/ld.exe: C:/Program Files/MySQL/MySQL Connector C++ 9.0/include/jdbc/cppconn/driver.h:86: undefined reference to `check(std::map<std::__cxx11::basic_string<char, std::char_traits
, std::allocator >, std::__cxx11::basic_string<char, std::char_traits , std::allocator >, std::less<std::__cxx11::basic_string<char, std::char_traits , std::allocator > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits , std::allocator > const, std::__cxx11::basic_string<char, std::char_traits , std::allocator > > > > const&)' collect2.exe: error: ld returned 1 exit status ninja: build stopped: subcommand failed.
报错翻译:未定义对check(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, ...>>)的引用
错误指向driver.h中的代码段:
inline static void check_lib() { check(std::string{}); check(std::map<std::string,std::string>{}); }
使用的测试代码main.cpp:
#include <stdlib.h> #include <iostream> #include <mysql_connection.h> #include <driver.h> #include <exception.h> #include <resultset.h> #include <statement.h> using namespace sql; int main(void){ sql::Driver *driver; sql::Connection *con; driver = get_driver_instance(); con = driver->connect("tcp://127.0.0.1:3306","root","pass"); return 0; }
解决方案
这个错误的核心是链接阶段未正确关联MySQL Connector C++的库文件——头文件仅提供函数声明,链接器需要找到包含函数实现的库文件才能完成编译。
- 确认Connector C++版本与MinGW编译器的架构匹配(32位/64位必须一致)
- 在CLion的
CMakeLists.txt中添加库链接配置:- 指定头文件路径:
include_directories("C:/Program Files/MySQL/MySQL Connector C++ 9.0/include/jdbc") - 指定库文件路径:
link_directories("C:/Program Files/MySQL/MySQL Connector C++ 9.0/lib64")(32位环境替换为lib) - 添加库链接指令:
target_link_libraries(你的项目名 mysqlcppconn)(Connector C++ 8.0+版本通常使用mysqlcppconn,部分版本可能需要mysqlcppconn8)
- 指定头文件路径:
示例CMakeLists.txt:
cmake_minimum_required(VERSION 3.27) project(your_project_name) set(CMAKE_CXX_STANDARD 17) # 引入头文件 include_directories("C:/Program Files/MySQL/MySQL Connector C++ 9.0/include/jdbc") # 指定库路径 link_directories("C:/Program Files/MySQL/MySQL Connector C++ 9.0/lib64") add_executable(your_project_name main.cpp) # 链接MySQL库 target_link_libraries(your_project_name mysqlcppconn)
- 若使用动态库,需将Connector C++目录下的
mysqlcppconn.dll复制到项目可执行文件所在目录,或把库路径添加到系统PATH环境变量中
内容的提问来源于stack exchange,提问作者JurajC

