使用C++ WinHTTP库编译出现符号错误,寻求解决方法
解决WinHttp链接符号未定义的问题
嘿,我一眼就看穿这个问题啦——你调用了WinHttp的API函数,但没告诉链接器要关联对应的库文件,这就是为啥编辑器里没语法错误,但编译时弹出一堆未定义符号的链接错误。
问题根源
你已经通过#include <WinHttp.h>引入了函数的声明,编辑器能识别这些API,所以不会标红报错。但这些函数的实际实现是在winhttp.lib这个库文件里的,链接器找不到这个库,就没法把函数调用和具体实现关联起来,自然就报出LNK2019这类错误了。
两种解决方法
方法1:在代码中添加编译指令
直接在#include <WinHttp.h>后面加一行编译指令,让编译器自动通知链接器去链接库:
#include "stdafx.h" #include <iostream> #include <string> #include <windows.h> #include <WinHttp.h> #pragma comment(lib, "winhttp.lib") // 关键的一行! int main() { HINTERNET hSession = NULL, hConnect = NULL, hRequest = NULL; hSession = WinHttpOpen(L"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36", WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0); // 建立连接请求 if (hSession) { hConnect = WinHttpConnect(hSession, L"http://api", 80, 0); } else { printf("error: %d", GetLastError()); } // 打开请求(此时还未建立连接) hRequest = WinHttpOpenRequest(hConnect, L"GET", NULL, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0); int x; std::cin >> x; return 0; }
方法2:在Visual Studio项目设置中手动添加库
如果不想在代码里加编译指令,可以通过项目配置来设置:
- 右键你的项目 → 选择「属性」
- 依次展开「配置属性」→「链接器」→「输入」
- 在「附加依赖项」里添加
winhttp.lib - 点击「确定」保存配置,重新编译即可
小提示
很多Windows系统API都需要手动链接对应的库文件,比如WinInet对应wininet.lib、Socket相关API对应ws2_32.lib,以后再遇到类似的链接错误,先想想是不是漏加了依赖库哦~
内容的提问来源于stack exchange,提问作者jimmy




