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
在jsoncpp
的README.md
中介绍了两种编译方式
- Building and testing with CMake
- 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
的一些资料
- 官方文档
- CMAKE_BUILD_TYPE
- BUILD_SHARED_LIBS
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY
- CMAKE_LIBRARY_OUTPUT_DIRECTORY
- -G
二、 项目中引用jsoncpp
- 在项目中添加
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
- 在项目中添加
libjsoncpp.a
,并在makefile
或编译命令中链接此静态链接库
$ ll lib/
total 2880
-rw-rw-r-- 1 aoniu aoniu 2949058 10月 15 18:20 libjsoncpp.a