在 Visual C++ 2013 專案中使用 MySQL Connector/C++ 1.1.4 進行靜態鏈接時,編譯通過但鏈接階段報告大量「無法解析的外部符號」錯誤,錯誤訊息均帶有 __declspec(dllimport) 前綴,例如:
error LNK2001: 無法解析的外部符號 "__declspec(dllimport) class sql::mysql::MySQL_Driver * __cdecl sql::mysql::get_driver_instance(void)"
這表示鏈接器嘗試從動態庫導入符號,但實際提供的是靜態庫,導致符號不匹配。
MySQL Connector/C++ 的頭文件 cppconn/build_config.h 中定義了宏 CPPCONN_LIB_BUILD。當該宏被定義時,頭文件會移除 __declspec(dllimport) 屬性,使符號以靜態庫方式導出。若未定義此宏,編譯器預設為動態鏈接模式,從而產生上述鏈接錯誤。
在包含 MySQL 相關頭文件之前,定義 CPPCONN_LIB_BUILD 宏(僅在發布模式下需要,調試模式通常使用動態庫)。具體代碼調整如下:
#ifndef _DEBUG #define CPPCONN_LIB_BUILD #endif #include <mysql_connection.h> #include <mysql_driver.h> #include <cppconn/statement.h> #include <cppconn/resultset.h> #include <cppconn/exception.h> #ifdef _DEBUG #pragma comment(lib, "mysqlcppconn.lib") #else #pragma comment(lib, "mysqlcppconn-static.lib") // 若為自行編譯源碼,可能還需鏈接 mysqlclient.lib #pragma comment(lib, "mysqlclient.lib") #endif
加入宏定義後重新編譯,鏈接錯誤即可消除,程序可正常連接 MySQL 數據庫。
mysqlcppconn.lib),避免運行時庫不匹配問題。