記錄 Visual Studio 下使用 MySQL C API(libmysql.lib)的完整配置流程、高頻鏈接錯誤(LNK2019)根因與 x64 平台遷移方案,附帶可直接編譯運行的最小化測試程式碼。
lib/opt 目錄,直接用 lib/)$(MYSQL_HOME)\include$(MYSQL_HOME)\liblibmysql.lib; ws2_32.libMD 或 MDd,避免 CRT 衝突1>main.obj : error LNK2019: 無法解析的外部符號 _mysql_server_init@12 1>main.obj : error LNK2019: 無法解析的外部符號 _mysql_init@4 1>main.obj : error LNK2019: 無法解析的外部符號 _mysql_real_connect@32 1>main.obj : error LNK2019: 無法解析的外部符號 _mysql_options@12
根因:專案平台為 Win32(x86),但 MySQL 庫與系統為 x64,導致調用約定(__stdcall 裝飾名)不匹配。
#include#include #include #pragma comment(lib, "ws2_32.lib") #pragma comment(lib, "libmysql.lib") using namespace std; int main() { MYSQL mydata; mysql_library_init(0, NULL, NULL); // 初始化庫 mysql_init(&mydata); // 初始化連接結構 mysql_options(&mydata, MYSQL_SET_CHARSET_NAME, "gbk"); // 字符集 if (mysql_real_connect(&mydata, "localhost", "root", "1234", "demo", 3306, NULL, 0)) { cout << "database connection OK!" << endl; } else { cerr << "Connect failed: " << mysql_error(&mydata) << endl; } mysql_close(&mydata); mysql_library_end(); return 0; }
關鍵參數說明:mysql_real_connect(&mydata, "host", "user", "pwd", "db", port, unix_socket, client_flag),通常只需修改 host/user/pwd/db 四項。
| 錯誤 | 原因 | 對策 |
|---|---|---|
| 無法打開 stdafx.h | 預編譯頭未配置 | 專案屬性 → C/C++ → 預編譯標頭 → 「不使用預編譯標頭」或正確指定 |
| _AFXDLL 缺失 / MFC 衝突 | /MD 編譯但專案類型非 MFC | 定義 _AFXDLL 或改用非 MFC 專案模板 |
| fatal error C1083: router.pch | 預編譯頭檔案遺失 | 清理解決方案 → 重新建置,或刪除 .pch 手動重建 |
libmysql.dll 需放在 exe 同目錄或系統 PATH 中。MYSQL_OPT_RECONNECT 自動重連:mysql_options(&mydata, MYSQL_OPT_RECONNECT, &reconnect_flag);