You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动