Я пишу простую программу на C ++, которая загружает файлы из онлайн-базы данных. Но всякий раз, когда я пытаюсь его скомпилировать, я получаю:
clang: error: unable to execute command: Bus error: 10
clang: error: linker command failed due to signal (use -v to see invocation)
Я видел, что это может быть вызвано неправильным использованием переменных char *, но я преобразовал свои C-строки в строки C ++. Вот код:
#include <fstream>
#include <string>
#include <map>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <json/json.h>
#include <curl/curl.h>
std::string downBuf;
struct packageType {
std::string type;
std::string vol;
std::string file;
};
struct package {
std::string name;
std::string desc;
std::string url;
packageType pkgType;
};
static size_t write_datas(char *ptr, size_t size, size_t nmemb, void *stream) {
size_t dataSize = size * nmemb;
downBuf += std::string(ptr);
return dataSize;
}
std::string downloadString(std::string url) {
CURL *curl_handle;
downBuf.clear();
curl_global_init(CURL_GLOBAL_ALL);
curl_handle = curl_easy_init();
curl_easy_setopt(curl_handle, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L);
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_datas);
//curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &pagefile);
curl_easy_perform(curl_handle);
curl_easy_cleanup(curl_handle);
return downBuf;
}
std::map<std::string, package> getPkgList(std::string url) {
Json::Reader reader;
Json::Value root;
reader.parse(downloadString(url), root);
std::map<std::string, package> retval;
for (Json::ValueIterator itr = root.begin(); itr != root.end(); itr++) {
package pkg;
pkg.name = (*itr)["name"].asString();
pkg.desc = (*itr)["description"].asString();
pkg.url = (*itr)["url"].asString();
packageType ptype;
ptype.type = (*itr)["pkgtype"]["type"].asString();
if (ptype.type == "dmg") {
ptype.vol = (*itr)["pkgtype"]["volname"].asString();
ptype.file = (*itr)["pkgtype"]["pkgpath"].asString();
}
if (ptype.type == "zip") {
ptype.file = (*itr)["pkgtype"]["pkgpath"].asString();
}
pkg.pkgType = ptype;
retval[itr.key().asString()] = pkg;
}
return retval;
}
package getPackage(std::map<std::string, package> list, std::string packageN) {
package retval2;
retval2.name = "None";
std::map<std::string, package>::iterator it = list.find(packageN);
if (it != list.end()) {
retval2 = list[packageN];
}
return retval2;
}
// pkgfetch <list|info|download> <package> <repository>
// if command is list, package can be anything, but MUST be something
int main(int argc, const char * argv[]) {
std::ofstream out;
out.open("/tmp/pkgdata", std::fstream::out | std::fstream::trunc);
std::string command = std::string(argv[1]);
std::string packageN = std::string(argv[2]);
std::string url = std::string(argv[3]);
std::map<std::string, package> pkgList = getPkgList(url);
if (command == "info") {
package retval = getPackage(pkgList, packageN);
if (retval.name == "None") return 2;
out << "Name: " << retval.name << "\nDescription: " << retval.desc << "\nPackage URL: " << retval.url;
} else if (command == "download") {
package retval = getPackage(pkgList, packageN);
if (retval.name == "None") return 2;
std::string packdata = downloadString(retval.url);
out.close();
out.open("/tmp/packdata", std::fstream::out | std::fstream::binary | std::fstream::trunc);
out << packdata;
} else if (command == "list") for (auto pkg : pkgList) out << pkg.first << "\n";
else return 1;
out.close();
return 0;
}
Я чувствую, что это может быть вызвано (*itr)
в getPkgList()
функции, но я видел ответ от кого-то еще на Stack Overflow, у которого это работало. Кто-нибудь знает, что может быть причиной этого?
Постскриптум Я строю без библиотек и всех библиотек, но нет никакой разницы.
Задача ещё не решена.
Других решений пока нет …