4

我最近一直在尝试了解有关 CURL 的更多信息,最后设法将它正确地编译和安装为我的测试项目的静态库。最终,我将继续学习发布表格等。

我已经成功地从http://www.google.se.

连接到安全的 http 页面时https://www.google.se,我得到一个空字符串作为页面内容。

我正在使用来获取有关选项的信息。

我已经尝试过这个答案中的东西,但它没有用,或者我做错了。
我也试过关闭verifypeer和verifyhost(虽然我真的很想练习安全的解决方案),但也没有用。

我需要做什么才能使其工作?难道我做错了什么?


这是测试代码

#include <iostream>
#include <string>
#include <curl/curl.h>

using namespace std;

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp){
    ((string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main(){
  CURL *curl;
  CURLcode res;
  string readBuffer;

  curl = curl_easy_init();
  if(curl){
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.se");
    //curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, TRUE);

    //Doesn't seem to work
    curl_easy_setopt(curl, CURLOPT_CAINFO, "path\\cacert.pem");

    //Neither does this
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    cout<<readBuffer<<endl;

    system("pause");
  }
  return 0;
}

更新

所以我从 curl 那里得到了错误消息Unsupported protocol,我猜这就是 SSL 不起作用时的意思。所以我不得不用 SSL 重新编译它(这很奇怪,因为我以为我第一次这样做了)但是......

我几乎要放弃了。叹。出于某种原因,现在它 NMAKE: fatal error U1077 nasmw在制作 SSL 时给了我错误,即使我清楚地将正确的 %PATH% 给了 nasm。我按照信中的步骤进行操作。

所以我尝试使用libcurl 类型的 curl 二进制文件,但我不知道如何在 VC++ 中正确链接它,因为我不熟悉库文件。

尝试编译测试项目时,我不断收到这些链接器错误。

1>main.obj : error LNK2019: unresolved external symbol _curl_easy_cleanup referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_strerror referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_perform referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_setopt referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_init referenced in function _main

如此沮丧......我希望我明白为什么它必须如此复杂。
我只想使用图书馆!


更新 2

好的...我设法使用 SSL 编译 curl 库并CURL_VERSION_SSL启用报告

curl_version_info_data * vinfo = curl_version_info(CURLVERSION_NOW);

if(vinfo->features & CURL_VERSION_SSL){
    cout<<"CURL: SSL enabled"<<endl;
}else{
    cout<<"CURL: SSL not enabled"<<endl;
}

//Prints out "CURL: SSL enabled"

但我仍然收到相同的错误消息Unsupported protocol。我不知道我做错了什么。

4

2 回答 2

2

好吧,在我第 n 次编译该库之后,一切似乎都很好,直到我调试它并且它给了我堆错误,表明我再次犯了一个错误 *twitch twitch*。

在开始新的编译会话之前,我再次查看了 curl.haxx 并找到了一个 MSVC 包。这让我很高兴,因为我知道如何处理这些!我选择了静态库,因为那是我想要的。

虽然并非一切顺利,但我必须添加一些额外的链接器依赖项才能使其正常工作。

#pragma comment(lib, "curllib_static.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "openldap.lib")
#pragma comment(lib, "libeay32.lib")

将它们放入并使用我下载的另一个包中的证书包,以便我可以连接到 HTTPS。

curl_easy_setopt(curl, CURLOPT_CAINFO, "_path_\ca-bundle.crt");

不过,我收到了一些警告,这些警告是我以前从未见过的。他们没有搞砸任何事情,但它与 PDB 文件“vc90”有关,我认为是 VC++ 自己处理的。

这是在最终拥有适当的 CURL 库https://www.google.se后连接到(删除并添加到项目属性下的链接器依赖项中的编译指示)的代码。

这是MSVC 包(启用 SSL)。您可以使用此包中的脚本之一(perl 或 VBscript)为您制作证书包。

哦,还有,如果你像我一样使用静态库,你必须添加预处理器定义CURL_STATICLIB

#include <iostream>
#include <string>
#include <curl/curl.h>

using namespace std;

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp){
    ((string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main(){
  CURL *curl;
  CURLcode res;
  string readBuffer;

  curl = curl_easy_init();
  if(curl){
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.se");
    curl_easy_setopt(curl, CURLOPT_CAINFO, "C:\\libcurl_static\\ca-bundle.crt");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    cout<<readBuffer<<endl;

    system("pause");
  }
  return 0;
}

真的是我的错,我应该检查他们拥有的下载向导上的描述。我只从档案库(7.27.0)下载了最新的源代码,因为我认为我必须自己编译它才能得到我想要的东西。

这整件事很尴尬。不过我从中学到了很多。

于 2012-10-04T22:17:52.777 回答
1

使用 -v 检查完整响应。这可能是一个重定向。此外,众所周知,Google 会阻止使用 curl 的默认用户代理完成的请求......

于 2012-10-02T22:00:42.447 回答