QT 中的卷曲"Expected token ')', got '__typeof__'"

CURL "Expected token ')', got '__typeof__'" in QT

本文关键字:typeof got token Expected QT      更新时间:2023-10-16

我正在开发一个程序,该程序应该在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

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

这是我下载文件的最后一招了,所以我真的需要让它工作。

编辑:

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

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函数再次工作,而不是愚弄得到这个工作。谢谢你的帮助。

诊断此问题的最佳方法可能是进行"仅预处理"编译。我假设您正在使用g++,因此您应该尝试-E开关并将其输出到文件中。然后看一下文件,看看curl_easy_setopt行是什么样子的。

UPDATE:对于QT creator,您可以通过更新.pro文件来保存编译过程中创建的临时文件,包括以下选项:

QMAKE_CXXFLAGS += -save-temps

来自GCC文档:

存储常用的" temporary "中间文件永久;的地方它们在当前目录和名称中它们基于源文件。因此,使用' -c -save-temp '编译foo.c会产生文件foo。I和foo。还有食物。这会创建一个预处理foo。I输出文件尽管编译器现在通常使用集成预处理器。

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

第二个失败"collect2: Id returned 1 exit status"不包含原因;你应该单独引用。我预计的原因是您忘记链接到CURL库,但这只是一个有根据的猜测。