嘗試使用 ENET 庫重寫 VNC 服務端,將傳輸協議從 TCP 改為 UDP。編譯通過,鏈接階段爆出大量 LNK2019 未解析的外部符號錯誤。
host.obj : error LNK2019: 無法解析的外部符號 __imp__htonl@4
win32.obj : error LNK2019: 無法解析的外部符號 __imp__setsockopt@20
... (共 26 個 Winsock 相關符號)
在專案中加入 Winsock 庫:
#include
#pragma comment(lib, "ws2_32.lib")
// 或專案屬性 → Linker → Input → Additional Dependencies 加入 ws2_32.lib
加入 ws2_32.lib 後,剩餘 3 個錯誤:
win32.obj : error LNK2019: __imp__timeBeginPeriod@4
win32.obj : error LNK2019: __imp__timeEndPeriod@4
win32.obj : error LNK2019: __imp__timeGetTime@0
加入多媒體庫:
#pragma comment(lib, "winmm.lib")
// 或專案屬性加入 winmm.lib
enet.lib(win32.obj) : error LNK2019: __imp__WSASendTo@36
enet.lib(win32.obj) : error LNK2019: __imp__WSARecvFrom@36
ENET 靜態庫內部呼叫 Winsock 函數,主專案鏈接時必須同樣鏈接 ws2_32.lib,符號才能傳遞解析。在主專案同樣加入 #pragma comment(lib, "ws2_32.lib") 即可。
| 功能 | 庫檔案 | 關鍵符號示例 |
|---|---|---|
| Winsock 基礎 | ws2_32.lib | htonl, setsockopt, ioctlsocket, select, WSASendTo, WSARecvFrom |
| 多媒體定時器 | winmm.lib | timeBeginPeriod, timeEndPeriod, timeGetTime |
看似棘手的鏈接錯誤,本質上皆為「缺少對應的 import library」。記錄備查,免得再踩坑。