JSonCpp的编译与使用
由于项目需要,需要在C++端来解析前端传输过来的json格式数据,需要找一个支持全平台(windows、Linux(aarch64/mips64el等架构))的json解析库。调查了许多对应的c++ 解析的数据库,最终选择了Jsoncpp,原因是:1、源代码不多,很快能够看完,并能够进行相对应的修改;2、接口设计的精巧简练又易用。3、是json官方推荐的解析工具。4、缺点就在于大量使用STL,相较
一、Json相关知识
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。(详解百度百科)。
简单理解,Json的组织形式就像 C/C++中的map一样,是通过key-value键值对来组织的,key是任意一个唯一字符串,value可以是bool,int,string 或者嵌套的一个json。关于Json 格式可以参考其对应官方网站。
二、JsonCpp相关知识
JsonCpp是c++端用于解析Json数据格式的一个库。现在它的下载都迁移到github上了,其源代码下载地址:https://github.com/open-source-parsers/jsoncpp。
1. 下载
浏览器访问https://github.com/open-source-parsers/jsoncpp,弹出下面的页面:
拖动到最下面,有JsonCpp的相关介绍。其中有一段这样的说明(用红色框勾出的部分,详见下图),该部分说明了现在所支持的C++版本的问题:1.y.z是需要用C++ 11来进行编译的;0.y.z是需要更老的编译器来进行编译的(初步测试,VS系列应该是Vs2008所配备的c++编译器;linux下的C++版本建议是gcc 4.9.4及其以下的版本);00.11.z两者编译器都可以进行使用。我选中的是0.y.z的版本,经过测试,基本上都可以进行编译。
记住,默认的版本是1.y.z,选择版本请在master选中框下进行下拉,选中要下载的版本0.y.z后,等浏览器跳转,单击Code框,然后点DownLoad ZIP即可。
2、编译
下载完源代码后,解压压缩文件,解压缩后的目录如下图:
首先第一步,是读取文件夹中的READMe.md文件,它简单介绍了JsonCpp相关的知识,以及怎么去编译该源代码。我详细贴出了它的介绍。
这份文本中,他的编译分为两种:Building and testing with CMake 以及 Building and testing with SCons。第一种基本上都是基于Linux环境来进行编译的。因此,Linux下的编译很简单,但要熟悉CMake的相关命令,我下面稍微解释一下相关命令的意思。
如果要利用cmake工具来构建,我们要打开源代码目录下的CMakeLists.txt文件来看看它所支持的最好版本的cmake是多少,如果高于指定的版本或者低于指定的版本,会报错!打开后有这样一个语句:CMAKE_MINIMUM_REQUIRED(VERSION 2.8.5),即Cmake的版本最高为2.8系列的,最低版本为2.5系列;因此要选择cmake版本。CMAKE_MINIMUM_REQUIRED的官方解释链接:https://cmake.org/cmake/help/v3.0/variable/CMAKE_MINIMUM_REQUIRED_VERSION.html。
2.1、Linux平台
该编译命令也适合国产化系统,以及不同的CPU系统,例如:飞腾、龙芯、兆芯、鲲鹏等。都经过验证,放心使用。
目前的测试机器环境是:ubuntu 14-04 LTS版本,如下图:
因为JsonCpp是一个c++库,系统中必须要安装gcc。现在的linux系统中,基本上都自带了一个gcc的版本,如果要查看gcc的版本,则打开终端,运行 gcc -v命令,即可查看相关信息。我的版本是4.8.4。如果要在国产化环境下使用,我建议下载0.y.z的版本,原因是有的国产化系统中gcc的版本太低,目前不支持一些C11的新特性,这是泪!!!!
因为linux下建议使用cmake来进行编译,因此电脑上必须安装cmake。首先运行 cmake --version命令,查看一下电脑上是否安装cmake编译工具,若没有安装,则有在线安装(运行对应的安装命令即可,如果是类debian系列的系统,则用apt-get install 命令来进行安装;如果是Centos系列的系统,则是用yum命令)以及离线安装(下载相对应的安装包以及依赖包)两种方式。
安装好cmake后,确定对应的版本中
如果编译前的环境都准备好了,则终端进入源代码目录,使用以下的命令来进行编译,最后的静态库生成目录在:源代码目录/build/debug/lib/目录下,生成的jsoncpp库的名字是:libjsoncpp.a。还有就是头文件所在目录是:源代码目录/include.
mkdir -p build/debug cd ./build/debug/ cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_SHARED_LIBS=OFF -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY=../../lib -G "Unix Makefiles" ../../ make
cmake命令的详细讲解详见https://cmake.org/documentation,浏览器进入后,选择对应的版本,则可以看到cmake命令的相关介绍。这里大体解释一下cmake所使用的命令:
CMAKE_BUILD_TYPE:该值表示所编译的版本,一般取值位:Debug, Release, RelWithDebInfo以及MinSizeRel。用的最多的是Debug以及Release。详见链接:https://cmake.org/cmake/help/v3.0/variable/CMAKE_BUILD_TYPE.html.
BUILD_SHARED_LIBS:该值表示编译动态库还是静态库。ON代表编译动态库,OFF表示编译静态库。最新的cmake版本把BUILD_STATIC_LIBS值取消了。详见链接:https://cmake.org/cmake/help/v3.0/variable/BUILD_SHARED_LIBS.html.
CMAKE_ARCHIVE_OUTPUT_DIRECTORY:该值表示静态库的输出目录,根据代码结构来看,直接指定../../lib目录,即debug目录下的lib目录来进行保存。详见链接:https://cmake.org/cmake/help/v3.0/variable/CMAKE_ARCHIVE_OUTPUT_DIRECTORY.html.
CMAKE_LIBRARY_OUTPUT_DIRECTORY: 该值表示动态库的输出目录。因为我项目中都是实用的静态库,该值没有使用,但写在自己,有可能下次使用。详见链接:https://cmake.org/cmake/help/v3.0/variable/CMAKE_LIBRARY_OUTPUT_DIRECTORY.html.
-G:该值表示所使用的构建工具类型。因为是linux系统,这里传递的值是:Unix Makefiles. 还有其他相关的值,详见链接:https://cmake.org/cmake/help/v3.0/manual/cmake-generators.7.html.
2.2、Window平台
windows平台下,我目前使用的是两个编译环境,即微软自带的Vs系列的编译器以及下载的Mingw64系列的编译器。Vs系列的编译器以及Mingw系列的编译器都可以使用cmake工具来进行构建。
2.2.1 cmake的安装
首先是安装Cmake编译工具。如果要下载最新的版本,则进入官方即可。CMake的官方下载地址:https://cmake.org/download/。
如果要下载老的版本,则进入下面的网址: https://cmake.org/files/。然后选择你需要的版本即可。
我选择v2.8的工具,然后根据自己的系统来选择需要下载的cmake工具。下载完成后,双击,一直单击下一步,记得在添加环境变量时,选择将该环境变量添加给所有用户即可。然后一直点击下一步,一直到完成。
安装完成后,打开cmd黑窗,输入cmake,能够显示cmake的一些信息即为安装成功,如下图:
安装cmake后,可以使用cmake-gui工具来进行构建。
2.2.2 VS系列编译
在这里需要注意一个问题:如果编译的是静态库,每个VS系列的编译器都要进行单独编译,因为静态库中的Vs系列的调试工具不一致,例如我用VS2019编译器去连接VS2010编译的静态库,会提示VS版本库不匹配的问题,因此建议每个VS版本的静态库都重新编译;动态库不存在此问题。
jsoncpp在windows下进行编译,分为两种:1、利用cmake-gui工具生成对应的解决方案,然后按照第二步的步骤进行编译(不建议,所以这步取消)。2、jsoncpp专门针对VS系列的编译器有一个安装目录,即源代码目录下的makefiles目录,该目录提供了两个编译器:msvs2010以及vs71。3、使用cmake相关命令来进行生成相对应的动态库(不建议使用,直接用2.2.2.1进行编译即可)。
2.2.2.1 VS本身的编译
我的Windows电脑上,安装了两个Vs系列的编译器,即VS2010以及VS2019。
进入msvc2010目录,找到Jsoncpp.sln文件,单击右键,选择用VS019的编译器打开。
打开后提示下面的框,点击确定即可,这样的话,VS2010对应的静态库以及VS2019对应的静态库都能够进行编译。
打开后,显示如下,然后单击lib_json选项,单击右键,选择属性按钮,则弹出下面的界面。
在该界面的配置类型中,可以选择生成动态库以及生成静态库。
如果要生成Vs2010编译器对应的库,则单击平台工具集对应的版本即可。
上面配置好了,然后点击确定,然后单击lib_json选项,单击右键,选择生成即可。生成后的目录在:Debug版本则在: 源代码目录/makefiles/msvc2010/Debug/lib_json.lib. Release版本则在:源代码目录/makefiles/msvc2010/Release/lib_json.lib。
2.2.2.2 使用cmake命令进行编译
使用cmake命令来编译,需要指定c/c++的编译器,其实跟使用CMske-GUI工具差不多,但使用命令相对来说,方便很多。
需要注意的是,cmake版本2.0系列跟3.0系列传递的参数有一定差距,目前使用的是cmake2.0系列,cmake3.0系列,详细查看官方文档:https://cmake.org/cmake/help/v3.0/manual/cmake.1.html。
首先在源代码目录下新建一个build目录,打开cmd命令提示符,使用cd命令进入build目录,然后运行下面的命令:
cmake.exe --no-warn-unused-cli -DCMAKE_BUILD_TYPE:STRING=Debug -G "Visual Studio 10" ../ cmake.exe --build D:\workspace\jsoncpp-0.y.z\build
no-warn-unused-cli:不警告在命令行声明但未使用的变量。
CMAKE_BUILD_TYPE:详见linux编译的解释。
-G:该值表示所使用的构建工具类型。因为是windows系统且使用VS2010编译器,这里传递的值是:Visual Studio 10. 如果要编译Vs2010版本的win64位库,这里需要传递字符串" Visual Studio 10 Win64"。
--build: 指定编译的目录。
运行第一条命令后,会产生下面输出,表示运行生成成功。
同时,build目录下回产生相对应的文件:
然后,运行第二条命令,cmd中会输出下面的信息,并表示运行成功。
进入目录,进行查看文件是否生成成功。即 源代码目录/src/lib_json/Debug目录下有jsoncpp.lib文件表示生成成功。
2.2.3 MingW64编译
在windows系统中,为了跟linux开发尽量保持代码一致,在编译测试的时候,我基本上会使用mingw64的开发工具来进行编译测试。我用的编译器是VSCode编译器。
2.2.3.1 mingw64的安装与配置
首先检测电脑上是否安装mingw64系列的编译器。打开终端,输入 mingw32-make.exe,看是否有输出,如果没有,则没有配置。
浏览器中键入官方下载地址:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/; 浏览器跳转后,如下图所示:
拖到最下面,如下图所示,去选择离线安装包,不建议选择在线安装,会很慢。选择勾选的包进行下载。
解压缩上面的文件后,并添加对应的环境变量值。步骤如下:
设置完后,打开cmd命令提示符,输入 gcc -v查看配置是否成功。配置成功后如下图所示:
2.2.3.2 cmake-gui进行编译
打开cmake-gui工具后,选择代码所在目录以及编译后的目录,如下图:
点击Configure按钮,弹出下面的框,选择编译的工具链,现在选择的是ming的工具链,然后下面选择指定的编译工具,因为我同时安装了mingw32以及mingw64的开发环境。
单击下一步,则进行mingw的编译路径选择,则弹出下面的框,然后选择c/c++的安装路径,选择后截图如下,然后单击完成。
完成后,则弹出下面的框。然后单击Generate按钮。
然后用cmd进入源代码的目录,执行以下mingw32-make.exe命令即可。
最后,进入源代码的最终编译目录,生成了libjsoncpp.a文件,截图如下:
2.2.3.3 cmake命令进行编译
配置好mingw系列的编译器后,可以使用cmake命令来进行编译。
cmake命令编译如下:
cmake.exe -DCMAKE_BUILD_TYPE=Debug -DBUILD_STATIC_LIBS=ON -DCMAKE_C_COMPILER:FILEPATH=D:/msys64/mingw64/bin/x86_64-w64-mingw32-gcc.exe -DCMAKE_CXX_COMPILER:FILEPATH=D:/msys64/mingw64/bin/x86_64-w64-mingw32-g++.exe -DCMAKE_MAKE_PROGRAM:FILEPATH=D:/msys64/mingw64/bin/mingw32-make.exe -G "MinGW Makefiles" ../ mingw32-make.exe
编译命令说明:
CMAKE_BUILD_TYPE:详见linux编译的解释。
CMAKE_C_COMPILER: 指定c格式源码的编译器,我这里指定的是64位的mingw的编译器。记住,如要要编译32位的静态库,要选择32位的mingw编译器。
CMAKE_CXX_COMPILER:指定c++格式源码的编译器,我这里指定的是64位的mingw的编译器。记住,如要要编译32位的静态库,要选择32位的mingw编译器。
-G:该值表示所使用的构建工具类型。因为使用的是mingw编译器,这里传递的值是:MinGW Makefiles.
执行完第一条命令后,命令提示符的输出如下,表示生成配置成功。
执行完第一条命令后,产生的目录结构如下:
然后执行第二条命令,命令提示符的输出如下,表示生成对应的静态库成功。
最后,进入源代码的最终编译目录,生成了libjsoncpp.a文件,截图如下:
三 参考资料
1、https://github.com/open-source-parsers/jsoncpp -------------------------------------- jsoncpp 源代码编译以及相关解释
2、https://cmake.org/cmake/help/v3.0/index.html --------------------------------------- cmake命令相关介绍
更多推荐
所有评论(0)