为什么C ++ WinInet函数的外部符号未解析?

问题描述 投票:0回答:2

我是一个被迫做一些C ++的Java程序员。什么样的恶梦!我正在尝试向这样的Web服务发送POST请求:

#include <Windows.h>
#include <tchar.h>
#include <WinInet.h>

    static TCHAR hdrs[] = _T("Content-Type: application/x-www-form-urlencoded");
    static TCHAR frmdata[] = _T("id=01&message=test_message");
    static LPCSTR accept[2] = { "*/*", NULL };
    static LPCWSTR tag = L"MyAgent";
    static LPCWSTR requestType = L"POST";

// for clarity, error-checking has been removed
HINTERNET hSession = InternetOpen(tag, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hSession, _T("desktop-60nl2pl:9998"), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hRequest = HttpOpenRequest(hConnect, requestType, _T("/GUser/login"), NULL, NULL, (LPCWSTR*)accept, 0, 1);
HttpSendRequest(hRequest, hdrs, strlen((char*)hdrs), frmdata, strlen((char*)frmdata));

该代码基于以下帖子:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/dc74e7bf-3ac9-41a0-b1c7-ece14a76a906/send-post-request-to-simple-php-page-using-wininet?forum=vcgeneral

它编译但不链接。获取一堆这些“未解析的外部符号_imp_InternetOpenW在函数中引用”类std :: vector

很抱歉,如果这是一个新问题,但我无法理解我读到的关于链接器错误的所有gobbldygook。有人可以简单解释一下吗?

c++
2个回答
0
投票

TL; DR您在链接器选项中缺少库。

.cpp.exe是一个两步操作。第一步是将.cpp转换为.obj的编译。第二步是将.obj转换为.exe的链接。

当您的程序变得足够大以至于需要两个或更多.cpp文件时,分两步执行此操作的原因变得非常明显。你自己编译每个.cpp,然后将两个.objs链接在一起。这会大大缩短您的迭代时间,尤其是当您有100个左右的.cpp文件并且只更改其中一个时。

在链接阶段,链接器还包括各种库。大多数真正常见的都是自动包含在内,所以一切都在合理的时间内“正常工作”。然而,不太常用的那些,例如,默认情况下不包括网络库,需要在链接器选项中明确命名。

幸运的是,微软很容易追踪它们。取一个未定义的函数名称,“undecorate”它以获得原始的返回,例如InternetOpen然后谷歌为InternetOpen msdn。第一个链接将带你到这里:https://msdn.microsoft.com/en-us/library/windows/desktop/aa385096(v=vs.85).aspx,如果你向右滚动到底部,有一个Requirements部分。列出你想要的库:wininet.lib所以你要做的就是在Additinal Dependencies下的Input选项的Linker页面的Project Properties字段中明确命名它,你应该好好去。

您正在使用Visual Studio,对吗?


2
投票

您正在引用InternetOpen等函数,但它们未在您的代码中定义。必须与代码链接的Win32库中的实时文件。在这种情况下,所有InternetXXXX函数都存在于WinInet.lib静态库和WinInet.dll动态链接库中。您必须链接WinINet.lib才能编译您的程序。

© www.soinside.com 2019 - 2024. All rights reserved.