jsoncpp的编译与应用

一、jsoncpp编译

1.1 源码准备

源码地址

官方文档

# 1. 直接下载zip压缩包,下载后解压即可
https://github.com/open-source-parsers/jsoncpp-docs/archive/refs/heads/gh-pages.zip

# 2. 使用https url进行clone,会因为网络原因,概率性clone失败
git clone https://github.com/open-source-parsers/jsoncpp-docs.git

# 3. 有github账号的话,并且做了相应配置的话,可以使用ssh url进行clone,更稳定
git clone git@github.com:open-source-parsers/jsoncpp-docs.git

1.2 编译

1.2.1 基本信息

以下为jsoncpp主页注释:

  • 1.y.z is built with C++11.
  • 0.y.z can be used with older compilers.
  • 00.11.z can be used both in old and new compilers.
  • Major versions maintain binary-compatibility.

jsoncpp使用分支来区分版本,其中主分支(master分支)为1.y.z版本,本文使用的也是这个版本。由于1.y.z要求编译器支持C++ 11标准,所以如果你的编译器版本在5.0以下,或者你自己的项目不能使用C++ 11 的话, 建议使用0.y.z

jsoncpp分支总览:

$ git branch -a
* master
  remotes/origin/0.y.z
  remotes/origin/00.11.z
  remotes/origin/BillyDonahue-avoid-isprint
  remotes/origin/HEAD -> origin/master
  remotes/origin/jsoncpp_version
  remotes/origin/master
  remotes/origin/pypi
  remotes/origin/update

jsoncppREADME.md中介绍了两种编译方式

  1. Building and testing with CMake
  2. Building and testing with SCons

作者主要在Linux下使用做开发,所以采用方式一,也就是使用cmake做编译

1.2.2 使用cmake编译

# 进入目录
$ cd jsoncpp/
$ ls
amalgamate.py      example
appveyor.yml       get_version.pl
AUTHORS            include
build              jsoncppConfig.cmake.in
BUILD.bazel        jsoncpp-namespaced-targets.cmake
bulid              LICENSE
cmake              meson.build
CMakeLists.txt     meson_options.txt
CONTRIBUTING.md    pkg-config
CTestConfig.cmake  README.md
dev.makefile       reformat.sh
devtools           src
doc                test
doxybuild.py       version.in

# 创建编译目录
$ mkdir -p build/debug
$ cd ./build/debug/

# 执行cmake
$ cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_SHARED_LIBS=OFF -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=../../lib -G "Unix Makefiles" ../../
# 以下是输出信息,下文同
-- JsonCpp Version: 1.9.5
-- Configuring done
-- Generating done
-- Build files have been written to: /data2/aoniu/tools/opensourse_tool/jsoncpp/build/debug
# 使用make进行编译
$ make
[  7%] Building CXX object src/lib_json/CMakeFiles/jsoncpp_static.dir/json_reader.cpp.o
[ 15%] Building CXX object src/lib_json/CMakeFiles/jsoncpp_static.dir/json_value.cpp.o
...
[ 84%] Building CXX object src/test_lib_json/CMakeFiles/jsoncpp_test.dir/fuzz.cpp.o
[ 92%] Building CXX object src/test_lib_json/CMakeFiles/jsoncpp_test.dir/main.cpp.o
[100%] Linking CXX executable ../../bin/jsoncpp_test
Testing ValueTest/checkNormalizeFloatingPointStr: OK
...
Testing MemberTemplateIs/BehavesSameAsNamedIs: OK
Testing VersionTest/VersionNumbersMatch: OK
All 119 tests passed
[100%] Built target jsoncpp_test

# 编译结果在项目根目录的 lib 目录下
# 回到项目根目录
$ cd ../..
# 查看编译结果
$ tree lib 
lib
└── libjsoncpp.a

0 directories, 1 file
# 查看头文件
$ tree include/
include/
├── CMakeLists.txt
├── json
│   ├── allocator.h
│   ├── assertions.h
│   ├── config.h
│   ├── forwards.h
│   ├── json_features.h
│   ├── json.h
│   ├── reader.h
│   ├── value.h
│   ├── version.h
│   └── writer.h
├── PreventInBuildInstalls.cmake
└── PreventInSourceBuilds.cmake

1 directory, 13 files

cmake的一些资料

二、 项目中引用jsoncpp

  1. 在项目中添加jsoncpp的头文件,也就是include/json下面的所有文件
$ ll include/json/
total 92
-rw-r--r-- 1 aoniu aoniu  2459 10月 14 18:12 allocator.h
-rw-r--r-- 1 aoniu aoniu  2817 10月 14 18:12 assertions.h
-rw-r--r-- 1 aoniu aoniu  5272 10月 14 18:12 config.h
-rw-r--r-- 1 aoniu aoniu   917 10月 14 18:12 forwards.h
-rw-r--r-- 1 aoniu aoniu  1805 10月 14 18:12 json_features.h
-rw-r--r-- 1 aoniu aoniu   447 10月 14 18:12 json.h
-rw-r--r-- 1 aoniu aoniu 14159 10月 14 18:12 reader.h
-rw-r--r-- 1 aoniu aoniu 30311 10月 14 18:12 value.h
-rw-r--r-- 1 aoniu aoniu   966 10月 14 18:12 version.h
-rw-r--r-- 1 aoniu aoniu 12109 10月 14 18:12 writer.h
  1. 在项目中添加libjsoncpp.a,并在makefile或编译命令中链接此静态链接库
$ ll lib/
total 2880
-rw-rw-r-- 1 aoniu aoniu 2949058 10月 15 18:20 libjsoncpp.a
posted @ 2022-10-17 19:56  ZhenNA  阅读(1034)  评论(0编辑  收藏  举报