问题包括jsonCpp标头

时间:2011-03-02 21:55:17

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

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

感谢您的时间!

6 个答案:

答案 0 :(得分:5)

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

如果不了解您的开发环境,很难给出更具体的说明。

顺便说一下,你在写C ++;请使用cstdio之类的C ++标题,而不是stdio.h。您也未能包含C ++ string,并且很幸运它通过一些JSON标题“工作”,包括它。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

在我的情况下(在Ubuntu上使用CodeBlocks IDE)问题是我需要将Point point = new Point(1,1); point.getX(); point.getY(); 项目中的json.cpp文件(generatedpython amalgamate.py)添加到我的建立目标。

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

答案 3 :(得分:0)

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

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

如果您使用的是Visual Studio,请将.lib文件添加到Project Properties,Linker,Input,Additional Dependencies并在Project Properties,Linker,General,Additional Library Directories中指定路径

答案 4 :(得分:0)

两个潜在问题:

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

  • 正如其他答案所示,#include

答案 5 :(得分:0)

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

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