3

我正在尝试在我的 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 是否需要额外的东西?

感谢您的时间!

4

6 回答 6

5

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

如果不了解更多关于您的开发环境的信息,就很难给您更具体的说明。

顺便说一句,您正在编写 C++;请使用 C++ 标头,例如cstdio, not stdio.h。您也未能包含 C++ string,幸运的是它通过包含它的 JSON 标头为您“工作”。

于 2011-03-02T21:58:04.930 回答
2

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

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

于 2011-03-02T21:58:54.127 回答
1

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

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

于 2015-12-29T19:13:44.703 回答
0

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

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

于 2012-08-21T06:45:24.000 回答
0

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

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

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

于 2011-03-02T21:57:58.907 回答
0

两个潜在问题:

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

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

于 2012-08-01T04:55:39.053 回答