我正在开发一个应该从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函数再次工作,而不是愚弄让它工作。谢谢你的帮助。
答案 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库,但这只是一个有根据的猜测。