【问题标题】:Problems including jsonCpp headers包含 jsonCpp 标头的问题
【发布时间】:2011-03-02 21:55:17
【问题描述】:

我正在尝试在我的 C++ 代码中实现 jsoncpp 库,我写了一段简单的代码只是为了尝试一下,它甚至没有编译。

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <string.h>

#ifndef json_included
#define json_included
#include "jsoncpp\include\json\json.h"
#endif

//#include "json\jsonC\json.h"
int main(int argc, char **argv)
{

std::string example = "{\"array\":[\"item1\", \"item2\"], \"not an array\":\"asdf\"}";
Json::Value value;
Json::Reader reader;

bool parsed = reader.parse(example, value, false);
std::cout << parsed;
return 0;
}

我得到的错误是:

undefined reference to `Json::Reader::parse(std::string const&, Json::Value&, bool)'
undefined reference to `Json::Reader::Reader()'
undefined reference to `Json::Value::~Value()'
undefined reference to `Json::Value::Value(Json::ValueType)'

我对 C++ 有点陌生,include 语句中是否缺少一些东西?还是 jsonCpp 需要额外的东西?

感谢您的宝贵时间!

【问题讨论】:

  • 包括 (您正在使用)而不是 stdio.h (您不是)以及 正如 Tomalak 指出的那样。此外,您几乎绝对不需要 #ifndef json_included 东西,因为它应该在您正在使用的标题中。

标签: c++ header include jsoncpp compiler-errors


【解决方案1】:

您的代码正在编译,但没有链接。您忘记向链接器提供 JSON 共享库文件(或者,在较新的版本中,将合并的 jsoncpp.cpp 添加到您的项目中)。

在不了解您的开发环境的情况下,很难为您提供更具体的说明。

顺便说一句,您正在编写 C++;请使用 cstdio 之类的 C++ 标头,而不是 stdio.h。你也没有包含 C++ string 并且很幸运它通过一些 JSON 标头为你“工作”了。

【讨论】:

    【解决方案2】:

    “未定义的引用”听起来像是 链接器 问题。 jsoncpp 是否带有需要链接的库,例如 .so、.a、.lib 或 .dll 文件?

    根据jsoncpp README,必须首先使用scons 构建库。大概这将输出一个库文件,例如 .so、.a、.lib 或 .dll 文件。然后,您必须遵循编译器的规则来链接此类库(例如,在编译时将其添加到命令行末尾,或将其添加到 IDE 项目配置中的“附加库”字段中)。

    【讨论】:

    • 它带有一个包含所有头文件的包含文件夹,以及一个包含所有 .cpp 文件的 src 文件夹。是否需要编译到库中?我认为预处理器命令#include 基本上采用了它指向的任何代码并将其替换。
    • #include 确实只是在文本上包含指定的文件。但是,它不包括 .cpp 文件。您将需要单独编译它们并链接它们(请参阅我编辑的答案。)
    【解决方案3】:

    就我而言(在 Ubuntu 上使用 CodeBlocks IDE),问题是我需要将 json.cpp 文件(generatedpython amalgamate.pyjsoncpp 项目中添加到我的构建目标中。

    换句话说,我在g++ 编译语句中添加了一个-c jsoncpp.cpp 选项。

    【讨论】:

      【解决方案4】:

      您需要链接到 json 库,例如使用 -ljson_linux-gcc-4.4.3_libmt

      您可以通过查看库目录找到确切的库名称,例如/usr/lib

      如果您使用的是 Visual Studio,请将 .lib 文件添加到项目属性、链接器、输入、附加依赖项,并在项目属性、链接器、常规、附加库目录中指定路径

      【讨论】:

        【解决方案5】:

        两个潜在问题:

        • 在某些版本的 jsoncpp 库代码中存在一个错误,其中合并需要成为合并才能使链接正常工作。

        • 正如其他答案所建议的那样,#include

        【讨论】:

          【解决方案6】:

          编译 jsoncpp 后,您可以在文件夹 libs/ 中找到库。为方便起见,您可以将它放在 /usr/lib 中,然后在运行时通过将 -llibjson_linux-gcc-4.4.3_libmt 作为参数传递给 g++ 来链接它。

          我已将 libjson_linux-gcc-4.4.3_libmt.so 重命名为 libjson.so 并可以通过指定 -ljson 来链接它。

          【讨论】:

          • 你是如何在 xcode 中构建 JsonCpp 的。我是 xcode 环境的新手
          猜你喜欢
          • 1970-01-01
          • 2011-09-29
          • 1970-01-01
          • 2011-12-07
          • 1970-01-01
          • 1970-01-01
          • 2021-06-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多