NuGet Curl C ++.Неразрешенный внешний символ только в сборке x64 - PullRequest
0 голосов
/ 07 июня 2018

Я уже искал решение в 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...