CURL“预期令牌”)',在QT中得到'__typeof__'

时间:2011-04-10 21:42:00

标签: c++ qt curl

我正在开发一个应该从QT中的站点下载文件的程序,但由于默认的QT库不起作用,我决定使用CURL。按照其网站文档部分的一个示例,我提出了以下代码:

downloader.h

#ifndef DOWNLOADER_H
#define DOWNLOADER_H

// Curl includes
#include "curl/curl.h"
#include "curl/types.h"
#include "curl/easy.h"

#include <QString>
#include <QObject>

class Downloader : QObject
{
    Q_OBJECT

public:
    Downloader();
    void DownloadFile(QString url, QString directory);

signals:
    void DownloadProgress(int downloaded, int total, QString message);
    void DownloadComplete();

private:
    void downProg(double t, double d, double ultotal, double ulnow);
    void read(void *ptr, size_t size, size_t nmemb, FILE *stream);
    void write(void *ptr, size_t size, size_t nmemb, FILE *stream);
};

#endif // DOWNLOADER_H

downloader.cpp

#include "downloader.h"

// Curl includes
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

Downloader::Downloader()
{

}

void Downloader::DownloadFile(QString url, QString directory) {
    CURL *curl;
    CURLcode res;
    FILE *outFile;
    //gchar *url = ptr;
    QString outFileName = directory + "/tempDL/minecraft.jar";

    curl = curl_easy_init();
    if (curl) {
        outFile = fopen(outFileName.toLocal8Bit().data(), "w");

        char *urlC = url.toLocal8Bit().data();
        curl_easy_setopt(curl, CURLOPT_URL, urlC);
    }
}

void Downloader::downProg(double t, double d, double ultotal, double ulnow) {

}

void Downloader::read(void *ptr, size_t size, size_t nmemb, FILE *stream) {

}

void Downloader::write(void *ptr, size_t size, size_t nmemb, FILE *stream) {

}

即使在构建之前,QT Creator会在我将鼠标悬停在该行上时告诉我:curl_easy_setopt(curl, CURLOPT_URL, urlC);以下内容:expected token ')' got '__typeof__'

然后,在编译程序时,我得到collect2: Id returned 1 exit status

在谷歌搜索了一下之后,我怀疑它可能是某种定义语句,但是在从我的班级中删除它后我找不到解决方案。

这是我对文件下载器的最后手段,所以我真的需要做这个工作。

修改

在查看编译器输出后,我发现了以下内容。我认为这可能会有所帮助:

WARNING: Failure to find: Fetcher/http_fetcher.h

WARNING: Failure to find: Fetcher/http_error_codes.h

WARNING: Failure to find: Fetcher/http_fetcher.h

WARNING: Failure to find: Fetcher/http_error_codes.h

并且,在评论出有问题的代码后,由于这行代码,似乎导致了collect2错误:

curl = curl_easy_init();

更新

经过几天的愚弄,它几乎没有让我感到沮丧。我决定尝试让默认的QT函数再次工作,而不是愚弄让它工作。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

诊断此问题的最佳方法可能是执行“仅预处理”编译。我假设您正在使用G ++,因此您应该尝试-E切换并输出到文件。然后看一下该文件,看看curl_easy_setopt行是什么样的。

更新:对于QT创建者,您可以通过更新.pro文件来保存在编译期间创建的临时文件,以包含此选项:

QMAKE_CXXFLAGS += -save-temps

来自GCC docs

  

存储通常的“临时”   永久中间文件;地点   它们在当前目录和名称中   他们基于源文件。从而,   使用`-c -save-temps'编译foo.c   会生成文件foo.i和foo.s,   以及foo.o.这创造了一个   预处理foo.i输出文件甚至   虽然编译器现在通常使用   集成的预处理器。

答案 1 :(得分:0)

__typeof__是GCC编译器的扩展,由CURL使用。这意味着GCC将编译CURL代码,但其他C ++解析器(如Qt Creator)将阻塞CURL代码。烦人,但并不重要。

第二次失败“collect2:Id返回1退出状态”不包括原因;你应该分别引用它。我期望的原因是你忘了链接到CURL库,但这只是一个有根据的猜测。