Я уже искал решение в Google , а здесь SO Я нашел только несколько вопросов о пакете lib, отличном от NuGet.
( Этот является пакетом NuGet. Я использую версию 7.52.1 , поскольку 7.53.0 имеет некоторые проблемы с совместимостью с программой, которую я разрабатываю, даже со сборкой x86)
Моя проблема в том, что когда я хочу построить свой проект в x64 , компоновщик выдает мне 149 ошибок о неразрешенном внешнем символе в libcurl.lib ( openssl.obj ), ( md5.obj ) и ( curl_ntlm_core.obj ).Я на 90% уверен, что все в порядке с настройками проекта для части x64, я проверял и перепроверял a лот раз, прежде чем обратиться сюда за помощью.
Это код, который я использую (, который работает на сборке 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")
Но кажется, что имена библиотек жестко закодированы в * 32.lib
Я хочу извиниться, если это будет дубликат, но я могуt найти решение для моего дела .
PS: я использую Visual Studio Community 2017
СпасибоВы за свое время !
[ОБНОВЛЕНИЕ]
Я не могу , кажется, найти решение, чтобы заставить локон работать такжесо сборкой x64.Поэтому я решил использовать WinINet (потому что мне нужно только загрузить HTML содержимое веб-страницы в виде строки ).
Я создал небольшой класс для этого, «единственная» проблема в том, что WinINet кажется намного медленнее ( примерно на 48% медленнее [я тестировал только некоторые файлы размером от 100 КБ до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
Это загрузит веб-страницу с заданного URL и вернет содержимое в строке RETURN
.
std::string content;
_Net::DownloadString("https://www.google.com", content);