26
votes

I have a project with the following layout:

   /build
   /source
        +--- CMakeLists.txt
        |
        +--- /bin
        |      +--CMakefiles.txt
        |      +--main.cpp
        |
        +--- /jsoncpp
        |       +--- /json
        |       |       +--json.h
        |       |       +--json-forwards.h
        |       |
        |       +--jsoncpp.cpp
        |       +--CMakeLists.txt
        |
        +--- /jsonreader
                 +-- jsonreader.cpp
                 +-- jsonreader.h
                 +-- CMakeLists.txt

In /source/CMakeLists.txt i have this line of code;

include_directories(jsoncpp jsonreader)

but then running 'cmake -G "MSYS Makefiles" ../source' in build directory generates Makefile and then running 'make' generates the following error:

Scanning dependencies of target updater
[ 33%] Building CXX object bin/CMakeFiles/updater.dir/main.cpp.obj
In file included from k:/own-projects/updater-Project/withJsonCpp/source/bin/main.cpp:2:0:
../source/jsonreader/jsonreader.h:2:18: fatal error: json.h: No such file
or directory
compilation terminated.
make[2]: *** [bin/CMakeFiles/updater.dir/main.cpp.obj] Error 1
make[1]: *** [bin/CMakeFiles/updater.dir/all] Error 2
make: *** [all] Error 2

what am i doing wrong and how can i solve this?

2
Shouldn't you add jsoncpp/json to your includes. Or in your C++ files do you use a relative path?drescherjm
@drescherjm: in my C++ i do use only "include "header.h" regardless of the location of the header is that wrong? adding jsoncpp/json does not work.Amani
I believe you want to prefix your include paths with ${CMAKE_SOURCE_DIR}drescherjm
@drescherjm: this works together with your first comment. If you don't mind please put it all as a proper answer, thanks.Amani

2 Answers

32
votes

There were two problems. Firstly you have to add the jsoncpp/json path to your included directories. However, doing so creates a second problem. Since your executables are not in the source folder you needed to prefix ${CMAKE_SOURCE_DIR} to your paths so include_directories() would look like following:

include_directories("${CMAKE_SOURCE_DIR}/jsoncpp"
    "${CMAKE_SOURCE_DIR}/jsoncpp/json"
    "${CMAKE_SOURCE_DIR}/jsonreader")

I've added quotes just out of habit. I do this most of the time with my CMakeLists.txt so there are no problems with spaces in paths.

10
votes

Amani,

It seems as if you include "json.h" without its relative path. You can either include it like this:

#include "json/json.h"

OR, in your CMakeLists.txt file, add the json directory to the include directories:

include_directories(jsoncpp jsoncpp/json jsonreader)