需開發 Erlang NIF 動態庫 mysql_nif.dll/.so,直接鏈結 MySQL C Client Library,記錄跨平台編譯關鍵點。
libmysql.dll:動態連結庫,執行期必須同目錄或 PATH 可見。libmysql.lib:libmysql.dll 的匯入庫,靜態鏈結時用。mysqlclient.lib:靜態庫,鏈結時不依賴 DLL,但需解決 CRT 衝突。libmysql.lib。mysql_nif.dll。libmysql.dll 放在同目錄或系統 PATH。/nodefaultlib:LIBCMT.lib /nodefaultlib:MSVCRTD.lib
解決多重 CRT 衝突(MT vs MD),再加入 mysqlclient.lib 鏈結。
gcc -fPIC -shared -o mysql_nif.so mysql_nif.c \
-I /usr/local/mysql/include/mysql \
-L /usr/local/mysql/lib/mysql \
-l mysqlclient \
-I /usr/local/lib/erlang/erts-5.8/include
-fPIC -shared:產生位置無關程式碼共享庫。-l mysqlclient:鏈結 libmysqlclient.so(通常在 /usr/lib/mysql 或 MySQL 安裝目錄)。ldconfig 或設定 LD_LIBRARY_PATH。MYSQL *conn = mysql_init(NULL);
if (!mysql_real_connect(conn, "host", "user", "pass", "db", 3306, NULL, 0)) {
fprintf(stderr, "Connect failed: %s\n", mysql_error(conn));
return;
}
if (mysql_query(conn, "SELECT VERSION()")) {
fprintf(stderr, "Query failed: %s\n", mysql_error(conn));
}
MYSQL_RES *res = mysql_store_result(conn);
while (MYSQL_ROW row = mysql_fetch_row(res)) {
printf("Version: %s\n", row[0]);
}
mysql_free_result(res);
mysql_close(conn);
include 目錄,Linux 通常 /usr/include/mysql。my_bool 型別在 MySQL 8.0 棄用,改用 bool 或 unsigned char。mysql_set_character_set(conn, "utf8mb4")。MYSQL 物件,或使用 mysql_thread_init()。Windows 推薦動態鏈結 libmysql.lib + 部署 DLL,避免 CRT 地雷;Linux 直接 -lmysqlclient 最省心。核心流程 init → connect → query → fetch → free → close 不變,注意資源釋放與錯誤處理即可穩定整合。