我是一个被迫做一些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));
它编译但不链接。获取一堆这些“未解析的外部符号_imp_InternetOpenW在函数中引用”类std :: vector
很抱歉,如果这是一个新问题,但我无法理解我读到的关于链接器错误的所有gobbldygook。有人可以简单解释一下吗?
TL; DR您在链接器选项中缺少库。
从.cpp
到.exe
是一个两步操作。第一步是将.cpp
转换为.obj
的编译。第二步是将.obj
转换为.exe
的链接。
当您的程序变得足够大以至于需要两个或更多.cpp
文件时,分两步执行此操作的原因变得非常明显。你自己编译每个.cpp
,然后将两个.obj
s链接在一起。这会大大缩短您的迭代时间,尤其是当您有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,对吗?
您正在引用InternetOpen等函数,但它们未在您的代码中定义。必须与代码链接的Win32库中的实时文件。在这种情况下,所有InternetXXXX函数都存在于WinInet.lib静态库和WinInet.dll动态链接库中。您必须链接WinINet.lib才能编译您的程序。