JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式,可读性强,易扩展,很适合做通信协议。
但在Linux底下,有时候写的C代码需要读取json文件,这时候需要cmake编译jsoncpp的源码。近期我在使用cmake对jsoncpp的时候,报错显示如下
[ 70%] Building CXX object src/test_lib_json/CMakeFiles/jsoncpp_test.dir/jsontest.cpp.o
In file included from /home/username/jsoncpp-master/src/test_lib_json/jsontest.cpp:7:0:
/home/username/jsoncpp-master/src/test_lib_json/jsontest.h: In member function ‘JsonTest::TestResult& JsonTest::TestResult::operator<<(const T&)’:
/home/username/jsoncpp-master/src/test_lib_json/jsontest.h:87:37: error: ‘hexfloat’ is not a member of ‘std’
oss << std::setprecision(16) << std::hexfloat << value;
^
make[2]: *** [src/test_lib_json/CMakeFiles/jsoncpp_test.dir/jsontest.cpp.o] Error 1
make[1]: *** [src/test_lib_json/CMakeFiles/jsoncpp_test.dir/all] Error 2
仔细一看,显示源码的头文件jsontest.h中hexfloat不是std的成员函数,难道是jsoncpp的代码出错?网上查却没有人提出相似的问题,百思不得其解,后来偶然发现std其实在C++98和C++11中略有不同,C++11对std进行了扩展,而对于gcc5.1之前的编译器,默认是C++98标准的,但是由于本文下载的jsoncpp源码是比较新的版本,所以应该用C++11或C++14的标准,所以应该对gcc编译器进行升级
一、gcc编译器版本升级方法
1. sudo add-apt-repository ppa:ubuntu-toolchain-r/test
2. sudo apt-get update
3. sudo apt-get install gcc-7
4. sudo apt-get install g++-7
5. sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 20
6. sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 20
若存在多个版本的gcc编译器,可使用以下语句进行切换默认的gcc编译器
7. sudo update-alternatives --config g++
修改~/.bashrc使gcc7支持C++11/14
sudo vim ~/.bashrc
在some more ls aliases注释块的地方添加下面这两行:
alias g++11=‘g++ -g -Wall -std=c++11’
alias g++14=‘g++ -g -Wall -std=c++14’
可以使用gcc -v或者g++ -v查看当前编译器版本
二、cmake编译jsoncpp
1、下载jsoncpp源码
wget https://github.com/open-source-parsers/jsoncpp/archive/master.zip
2、解压缩源码文件
unzip -x master.zip
3、cmake源码安装jsoncpp
cd jsoncpp-master
mkdir -p ./build/debug
cd ./build/debug
cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_INCLUDEDIR=include/jsoncpp -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ../..
sudo make && make install
安装成功如下
sudo make成功如下
sudo make install成功如下