我已经在 Google 上搜索了一个解决方案,而在 SO 上我找到了一些关于非NuGet lib包的问题。
(This是NuGet包。我使用 7.52.1 版本,因为 7.53.0 与程序有一些兼容性问题我是即使使用x86构建也可以开发)
我的问题是,当我想将项目构建为 x64 时,链接器会向我提供有关未解析的外部符号的 149 错误 libcurl.lib ( openssl.obj ),( md5.obj )和( curl_ntlm_core.obj )。 我90%确定x64部分的项目设置一切正常,我已经验证并重新验证 很多次,然后再向我们寻求帮助。
这是我使用的代码(谁在x86版本上工作):
#include <string>
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "Ws2_32.lib")
#define CURL_STATICLIB
#include <curl\curl.h>
class _Curl {
private:
static size_t _CURLWriteCallback(void* contents, size_t size, size_t nmemb, void* userp) {
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
public:
static BOOL DownloadString(const std::string &URL, std::string &strGET, LONG CONNECTION_TIMEOUT_MS = 1000) {
CURL* _CURL;
CURLcode _CURL_RESPONSE;
_CURL = curl_easy_init();
if (_CURL) {
curl_easy_setopt(_CURL, CURLOPT_URL, URL.c_str());
curl_easy_setopt(_CURL, CURLOPT_CONNECTTIMEOUT_MS, CONNECTION_TIMEOUT_MS);
curl_easy_setopt(_CURL, CURLOPT_WRITEFUNCTION, _CURLWriteCallback);
curl_easy_setopt(_CURL, CURLOPT_WRITEDATA, &strGET);
_CURL_RESPONSE = curl_easy_perform(_CURL);
curl_easy_cleanup(_CURL);
}
if (_CURL_RESPONSE == CURLE_OK) { return TRUE; }
return FALSE;
}
};
我也试图改变这部分
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "Ws2_32.lib")
使用
#pragma comment(lib, "wldap64.lib")
#pragma comment(lib, "crypt64.lib")
#pragma comment(lib, "Ws2_64.lib")
但似乎lib的名称被硬编码为* 32.lib
我想说对不起,如果这是重复的,但我无法找到我的案例的解决方案。
P.S:我正在使用 Visual Studio Community 2017
感谢您的时间!
[UPDATE]
我无法似乎找到了使curl能够与x64构建一起工作的解决方案。
所以我使用WinINet解决了问题(因为我只需要将网页的 HTML 内容下载为字符串)。
我已经创建了一个小类来实现这一点,“唯一”的问题是WinINet似乎要慢得多(大约慢了48%[我只测试了一些大小在100KB到800KB之间的文件] )。
如果有人遇到同样的问题并希望使用“解决方法”这是我写的课程
#ifndef _NET_H
#define _NET_H
#include <iostream>
#include <string>
#include <tchar.h>
#include <Windows.h>
#include <WinINet.h>
#pragma comment(lib, "WinINet.lib")
class _Net {
public:
static BOOL DownloadString(const std::basic_string<TCHAR> &URL, std::basic_string<TCHAR> &RETURN, DWORD CONNECTION_TIMEOUT_MS = 1000, DWORD CONNECTION_RETRIES = 1) {
if (InternetCheckConnection(_T("http://www.google.com"), FLAG_ICC_FORCE_CONNECTION, 0) == FALSE)
return 0;
HINTERNET _hOpen = InternetOpen(0, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
if (!_hOpen)
return 0;
InternetSetOption(_hOpen, INTERNET_OPTION_SEND_TIMEOUT
& INTERNET_OPTION_RECEIVE_TIMEOUT
& INTERNET_OPTION_CONNECT_TIMEOUT, &CONNECTION_TIMEOUT_MS, sizeof(DWORD));
InternetSetOption(_hOpen, INTERNET_OPTION_CONNECT_RETRIES, &CONNECTION_RETRIES, sizeof(DWORD));
DWORD _f = INTERNET_FLAG_DONT_CACHE |
INTERNET_FLAG_SECURE |
INTERNET_FLAG_NO_CACHE_WRITE |
INTERNET_FLAG_PRAGMA_NOCACHE |
INTERNET_FLAG_IGNORE_CERT_CN_INVALID |
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID;
HINTERNET _hInternet = InternetOpenUrl(_hOpen, URL.c_str(), 0, 0, _f, 0);
if (!_hInternet) {
CloseHandle(_hOpen);
return 0;
}
TCHAR _data[2]; ZeroMemory(&_data, sizeof(_data));
DWORD _dataReceivedSize;
std::basic_string<TCHAR> _strResult;
while (InternetReadFile(_hInternet, _data, 1, &_dataReceivedSize) && _dataReceivedSize)
_strResult += _data;
CloseHandle(_hInternet);
CloseHandle(_hOpen);
if (_strResult.length() == 0)
return 0;
RETURN = _strResult;
return 1;
}
};
#endif //_NET_H
这将从给定的网址下载网页,并返回RETURN
字符串中的内容。
std::string content;
_Net::DownloadString("https://www.google.com", content);