在 Windows XP 環境下運行依賴 libcurl 的應用程式(如 QQ)時,常會遇到「無法定位程序輸入點 GetTickCount64」的錯誤訊息。這是因為 GetTickCount64 函數僅在 Windows Vista 及更新版本的 kernel32.dll 中提供,而 XP 的核心庫缺少此函數導致動態連結失敗。使用 IDA Pro 打開 libcurl.dll 的導入表即可確認對 GetTickCount64 的依賴引用。
核心思路是下載 cURL 原始碼,修改時間獲取相關代碼以移除 GetTickCount64 依賴,並配置編譯選項支援 XP 平台,最後使用 Visual Studio 2015 進行編譯。
從官方網站下載 cURL 7.50.3 版本源碼包:
https://curl.haxx.se/download/curl-7.50.3.tar.gz
需修改兩個關鍵文件,將條件編譯指令調整為強制使用 GetTickCount()(XP 全版本支援),屏蔽 GetTickCount64() 相關邏輯。
lib/timeval.c 中的 curlx_tvnow() 函數:struct timeval curlx_tvnow(void) {
struct timeval now;
DWORD milliseconds = GetTickCount();
now.tv_sec = milliseconds / 1000;
now.tv_usec = (milliseconds % 1000) * 1000;
return now;
}
src/tool_util.c 中的 tool_tvnow() 函數:struct timeval tool_tvnow(void) {
struct timeval now;
DWORD milliseconds = GetTickCount();
now.tv_sec = (long)(milliseconds / 1000);
now.tv_usec = (milliseconds % 1000) * 1000;
return now;
}
編輯 winbuild/MakefileBuild.vc,在 CFLAGS 與 CURL_CFLAGS 中添加 /D_USING_V110_SDK71_ 宏以啟用 XP 相容工具集;在 CURL_LFLAGS 中加入 /subsystem:console,"5.01" 指定子系統版本為 5.01(對應 XP)。
打開「Visual Studio 2015 x64 x86 兼容工具命令提示符」,進入源碼目錄執行:
nmake /f Makefile.vc mode=dll MACHINE=x86 ENABLE_WINSSL=no ENABLE_IDN=no ENABLE_SSPI=no
編譯成功後,目標 libcurl.dll 將生成於 {CURL_SRC}/builds 目錄下,替換原有文件即可解決問題。