Msys2 Mingw64环境下使用MySQL Connector/C++运行时出现段错误求助
从你的描述来看,代码编译成功但运行时触发段错误,大概率是架构不匹配、动态库依赖问题或者未捕获的异常导致的,下面是几个针对性的排查和解决步骤:
1. 修正32/64位架构冲突
你使用的是Mingw64(64位环境),但编译命令里包含了32位的头文件路径-I /c/msys64/mingw32/include/,这会导致编译时混合32位与64位的头文件,进而引发运行时的架构不匹配错误:
- 移除编译命令中的
-I /c/msys64/mingw32/include/参数 - 确认你安装的MySQL Connector/C++是64位版本(对应Mingw64环境),如果之前装的是32位,卸载后重新下载适配64位的安装包
2. 尝试链接静态库避免动态依赖问题
动态库加载异常是Mingw环境下常见的崩溃诱因,试试切换到静态库链接:
修改编译命令,把-lmysqlcppconn换成-lmysqlcppconn-static,同时额外链接MySQL的C客户端库-lmysqlclient,完整命令示例:
g++ -Wall -I "/c/Program Files/MySQL/Connector C++ 1.1/include/" -I "/c/Program Files/MySQL/Connector C++ 1.1/include/cppconn" -L "/c/Program Files/MySQL/Connector C++ 1.1/lib/opt" -o test test.cpp -lmysqlcppconn-static -lmysqlclient --verbose
3. 添加异常捕获排查连接错误
你的代码没有处理SQL异常,可能是连接过程中抛出了未被捕获的异常,导致程序崩溃(表现为段错误)。修改代码添加异常处理逻辑:
#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; try { driver = get_driver_instance(); con = driver->connect("tcp://127.0.0.1:3306","root","coolpasswd"); // 记得释放连接资源 delete con; } catch (sql::SQLException &e) { std::cerr << "SQL错误: " << e.what() << std::endl; std::cerr << "错误代码: " << e.getErrorCode() << std::endl; return 1; } catch (std::exception &e) { std::cerr << "通用错误: " << e.what() << std::endl; return 1; } return 0; }
重新编译运行后,若有错误会输出具体信息,帮你快速定位问题根源。
4. 检查运行时依赖是否正常
在Msys2终端中,用ldd命令检查可执行文件的依赖库状态:
ldd test.exe
查看输出中libmysqlcppconn.dll(或静态库对应的依赖)是否存在,有没有not found提示,或是32位库混入64位环境的架构不匹配信息。同时确认PATH环境变量中仅包含64位Connector/C++的库路径,避免和32位路径冲突。
5. 确认MySQL服务状态
虽然段错误通常和服务无关,但先确保本地MySQL实例在127.0.0.1:3306正常运行——用MySQL客户端(比如mysql -h 127.0.0.1 -u root -p)测试能否正常连接,排除服务未启动或端口配置错误的情况。
内容的提问来源于stack exchange,提问作者hellohihihi




