Jayden Le
Jayden Le

Reputation: 41

Problems including jsonCpp headers

I'm trying to implement the jsoncpp libraries in my C++ code, I wrote a simple piece of code just to try it out, and it's not even compiling.

#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;
}

The errors i'm getting are:

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)'

I'm a bit new to C++, is there something I'm missing in the include statement? Or does jsonCpp need something extra?

Thank you for your time!

Upvotes: 3

Views: 20992

Answers (6)

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385144

Your code is compiling, but it is not linking. You forgot to provide the JSON shared library files to your linker (or, on newer versions, to add the amalgamated jsoncpp.cpp to your project).

Without knowing more about your development environment, it's hard to give you more specific instructions.

BTW, you're writing C++; use C++ headers like cstdio, not stdio.h, please. You also failed to include C++ string and got lucky that it "worked" through some JSON header including it for you.

Upvotes: 5

Nick Charney Kaye
Nick Charney Kaye

Reputation: 4340

In my case (using CodeBlocks IDE on Ubuntu) the problem was that I needed to add the json.cpp file (generated with python amalgamate.py from within the jsoncpp project) to my build targets.

In other words, I added a -c jsoncpp.cpp option to my g++ compile statement.

Upvotes: 1

Vihaan Verma
Vihaan Verma

Reputation: 13143

After you compile jsoncpp you can find the libraries in the folder libs/ . For convenience you can put it in /usr/lib and then link it at run time by passing -llibjson_linux-gcc-4.4.3_libmt as an argument to g++.

I have renamed libjson_linux-gcc-4.4.3_libmt.so to libjson.so and can link it by specifying -ljson.

Upvotes: 0

Deniz
Deniz

Reputation: 1511

Two potential issues:

  • There is a bug in some versions of the jsoncpp library code where amalgated needs to become amalgamation for the linking to work correctly.

  • As the other answers suggested, #include

Upvotes: 0

Anthony Williams
Anthony Williams

Reputation: 68581

"Undefined reference" sounds like a linker problem. Does jsoncpp come with a library that you need to link to, such as a .so, .a, .lib or .dll file?

According to the jsoncpp README, the library must first be built using scons. Presumably this will then output a library file such as a .so, .a, .lib or .dll file. You must then follow your compiler's rule for linking against such a library (e.g. add it to the end of the command line when compiling, or add it to the "additional libraries" field in the project config in your IDE).

Upvotes: 2

Erik
Erik

Reputation: 91270

You need to link to the json libraries, e.g. using -ljson_linux-gcc-4.4.3_libmt

You can find the exact library name by looking in the library directory, e.g. /usr/lib

If you're using Visual Studio, add the .lib file to Project Properties, Linker, Input, Additional Dependencies and specify the path in Project Properties, Linker, General, Additional Library Directories

Upvotes: 0

Related Questions