I cannot find a way to link jsoncpp with my executable. I have tried many things but none succeeded:
find_package(PkgConfig REQUIRED)
pkg_check_modules(JSONCPP jsoncpp)
link_libraries(${JSONCPP_LIBRARIES})
add_executable(myprogram myprogram.cpp)
target_link_libraries(myprogram ${JSONCPP_LIBRARIES})
I want to use the jsoncpp library that comes with ubuntu. Has anyone managed to do this?
$ ls /usr/lib/x86_64-linux-gnu/libjsoncpp.*
/usr/lib/x86_64-linux-gnu/libjsoncpp.a /usr/lib/x86_64-linux-gnu/libjsoncpp.so.1
/usr/lib/x86_64-linux-gnu/libjsoncpp.so /usr/lib/x86_64-linux-gnu/libjsoncpp.so.1.7.4
CMakeLists.txt
cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR)
project(jsoncpp_example)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -stdlib=libc++ -Wall -Werror")
set(CMAKE_EXE_LINKER_FLAGS "-lstdc++ -lpthread")
add_executable(parse main.cpp)
target_include_directories(parse PRIVATE include)
target_link_libraries(parse jsoncpp)
Parser.h
#ifndef MY_PARSER_H
#define MY_PARSER_H
#include <vector>
#include <fstream>
#include <jsoncpp/json/json.h>
class MyParser {
public:
MyParser() = default;
~MyParser() = default;
inline static
Json::Value parse(const char* inputFile) {
Json::Value val;
std::ifstream ifs(inputFile);
Json::Reader reader;
reader.parse(ifs, val);
return val;
}
};
#endif /* MY_PARSER_H */
main.cpp
#include <iostream>
#include "Parser.h"
int main(){
Json::Value val = MyParser::parse("input.json");
std::cout << val["name"] << std::endl;
}
Ubuntu 18.04, compiling with clan-8.0
CXX=clang-8 cmake ..
make -j
The error I get
Scanning dependencies of target parse
[ 50%] Building CXX object CMakeFiles/parse.dir/main.cpp.o
[100%] Linking CXX executable parse
CMakeFiles/parse.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x3e): undefined reference to `Json::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, Json::Value const&)'
CMakeFiles/parse.dir/main.cpp.o: In function `MyParser::parse(char const*)':
main.cpp:(.text._ZN8MyParser5parseEPKc[_ZN8MyParser5parseEPKc]+0x349): undefined reference to `Json::Reader::parse(std::__1::basic_istream<char, std::__1::char_traits<char> >&, Json::Value&, bool)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
CMakeFiles/parse.dir/build.make:94: recipe for target 'parse' failed
make[2]: *** [parse] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/parse.dir/all' failed
make[1]: *** [CMakeFiles/parse.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
The wiki mentions
get_target_property(JSON_INC_PATH jsoncpp_lib INTERFACE_INCLUDE_DIRECTORIES)
include_directories(${JSON_INC_PATH})
target_link_libraries(${PROJECT_NAME} jsoncpp_lib)
but I couldn't get that to work myself. If you have the jsoncpp
.cmake
files installed in a place searched automatically, this could be an option:
cmake_minimum_required(VERSION 3.8.0 FATAL_ERROR)
project(jsoncpp_example)
find_package(PkgConfig REQUIRED)
pkg_check_modules(JSONCPP jsoncpp)
set(CMAKE_THREAD_PREFER_PTHREAD TRUE) # these are to use the prefered -pthread flag
set(THREADS_PREFER_PTHREAD_FLAG TRUE) # over the -lpthread option
find_package(Threads REQUIRED)
add_executable(parse main.cpp)
set_property(TARGET parse PROPERTY CXX_STANDARD 17)
target_compile_options(parse PRIVATE -Wall -Werror)
target_link_libraries(parse PRIVATE Threads::Threads ${JSONCPP_LIBRARIES})
On Linux this worked for me
install the dev libs.
sudo apt-get install libjsoncpp-dev
in cmakelists.
pkg_search_module(JSONCPP jsoncpp)
add to...
TARGET_LINK_LIBRARIES(${JSONCPP_LIBRARIES})
For those who came to this topic, like me, who are looking for a way to include the jsoncpp library in a C++ project with cmake. I solved this problem by cloning the vcpkg repository into an external folder and installing the jsoncpp package through vcpkg, as the official jsoncpp repository suggests. I've better described the solution to this problem in this topic here since it was more generic in search terms.
With cmake 3.22 i got it to work:
find_package(jsoncpp REQUIRED)
...
target_link_libraries({app_name} ... jsoncpp_lib)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.