编译C ++程序时出现总线错误10

时间:2017-04-18 18:04:21

标签: c++ clang bus-error

我正在用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上其他人的答案。有人知道是什么原因引起的吗?

P.S。我正在构建没有库和所有库,但没有区别。

0 个答案:

没有答案