NuGet Curl C ++。仅使用x64 build

时间:2018-06-06 21:08:56

标签: c++ curl visual-studio-2017

我已经在 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);

0 个答案:

没有答案