Windows下MySQL Connector C++ 8.0编译出现undefined reference to `check`错误
连接MySQL Connector C++ 8.0时的链接错误解决
问题场景
尝试用MySQL Connector C++ 8.0连接C++程序与数据库,编译以下代码时出现链接错误:
#include <iostream> #include <jdbc.h> int main(){ sql::Driver *driver; driver = get_driver_instance(); return 0; }
错误信息
c:/program files (x86)/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\newva\AppData\Local\Temp\ccjFB5x8.o:Main.cpp:(.text+0x1f): undefined reference to `check(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' c:/program files (x86)/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\newva\AppData\Local\Temp\ccjFB5x8.o:Main.cpp:(.text+0x53): 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&)' collect2.exe: error: ld returned 1 exit status
注释掉driver = get_driver_instance();后程序可正常编译,使用的Makefile配置如下:
MYSQL_CONCPP_DIR = "C:\\Program Files\\MySQL\\Connector C++ 8.0" CPPFLAGS=-I $(MYSQL_CONCPP_DIR)\\include\\mysql -L $(MYSQL_CONCPP_DIR)\\lib64\\vs14 LDLIBS=-lmysqlcppconn CXXFLAGS=-std=c++20 result.exe:Main.cpp g++ Main.cpp ${CXXFLAGS} ${CPPFLAGS} ${LDLIBS} -o result.exe
操作系统:Windows 10
解决方案
1. 解决编译器兼容性问题
你当前使用MinGW(GCC)编译代码,但链接的是VS14(MSVC)编译的库文件,二者C++标准库实现(如std::__cxx11字符串)不兼容,导致符号无法匹配。
- 前往MySQL官网下载MinGW架构的Connector C++ 8.0安装包,替换当前的VS版本库文件。
- 修改Makefile中的库路径,将
lib64\\vs14改为MinGW版本库所在路径(例如lib64\\mingw,具体以下载的包结构为准)。
2. 调整链接顺序与参数
GCC要求库文件放在源文件之后,确保链接顺序正确;同时可强制链接标准库:
修改Makefile的编译命令为:
g++ Main.cpp ${CXXFLAGS} ${CPPFLAGS} -o result.exe ${LDLIBS}
或在LDLIBS中添加标准库链接:
LDLIBS=-lmysqlcppconn -lstdc++
3. 添加适配宏定义
如果使用动态库,在CXXFLAGS中添加适配GCC的宏:
CXXFLAGS=-std=c++20 -DMYSQLCPPCONN_DYNAMIC_LINK
内容的提问来源于stack exchange,提问作者gargaranza
相关产品推荐
相关产品推荐

