我是一个被迫做一些C++的Java程序员。真是一场噩梦!我试图向这样的web服务发送一个帖子请求:
#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));它编译但不链接。获取这些“函数中引用的未解析外部符号_imp_InternetOpenW”类std::vector
对不起,如果这是一个新的问题,但我不能理解所有的gobbldygook,我读到的链接错误。有人能用简单的术语来解释吗?
发布于 2018-03-15 01:17:33
博士,你在链接器选项中缺少了一个库。
从.cpp到.exe是一个两步操作。第一步是编译,将.cpp转换为.obj。第二步是将.obj转换为.exe的链接。
当您的程序变得足够大,需要两个或多个.cpp文件时,分两个步骤这样做的原因非常明显。您可以单独编译每个.cpp,然后将两个.obj链接在一起。这大大减少了您的迭代时间,特别是当您有大约100个.cpp文件并且只更改其中一个文件时。
在链接阶段,链接器还包括各种库。大多数真正常见的™都是自动包含的,所以一切都是“正确的”,这是一个合理的百分比。然而,使用较少的链接库,例如,默认情况下不包括网络库,并且需要在链接器选项中显式命名。
幸运的是,微软让追踪他们变得相当容易。取其中一个未定义的函数名,“取消修饰”,以获得原始的函数名称,例如InternetOpen,然后GoogleforInternetOpen msdn。第一个链接将带您到这里:https://msdn.microsoft.com/en-us/library/windows/desktop/aa385096(v=vs.85).aspx,如果您一直滚动到底部,就会有一个Requirements部分。在这里列出了您想要的库:wininet.lib,所以您所要做的就是在Project Properties下的Linker选项的Input页面的Additinal Dependencies字段中显式地命名它,您应该做得很好。
您正在为此使用,对吗?
发布于 2018-03-15 01:25:25
您正在引用诸如InternetOpen之类的函数,但它们没有在代码中定义。必须与您的代码链接的Win32库中的活动。在本例中,所有InternetXXXX函数都位于WinInet.lib静态库和WinInet.dll动态链接库中。您必须链接到WinINet.lib,程序才能编译。
https://stackoverflow.com/questions/49289998
复制相似问题