2

我正在用 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 上看到了其他人的答案,他们让它工作。有人知道是什么原因造成的吗?

PS我正在构建没有库和所有库,但没有区别。

4

0 回答 0