Windows下编译
一、下载Jsoncpp
1.1 文件名
jsoncpp-src-0.5.0.tar.gz
1.2 Jsoncpp下载地址
http://sourceforge.net/projects/jsoncpp/
二、编译Jsoncpp
2.1 下载,解压
下载jsoncpp-src-0.5.0.tar.gz,解压缩到D:\。
2.2 编译
进入目录D:\jsoncpp-src-0.5.0\makefiles\vs71,打开jsoncpp.sln,编译。
2.3 生成结果
在目录D:\jsoncpp-src-0.5.0\build\vs71\debug\lib_json下,生成文件json_vc71_libmtd.lib。
三、Jsoncpp示例代码
3.1 配置编译环境
1. 将json_vc71_libmtd.lib,拷贝到当前工程下。
2. 将D:\jsoncpp-src-0.5.0\include\json目录,拷贝到当前工程下。
3.2 代码
- #include <fstream>
- #include <string>
- #include "../json/json.h"
- using namespace std;
- #pragma comment(lib,"json_vc71_libmtd.lib")
- void main()
- {
- ifstream ifs;
- ifs.open("test.json", ios::out|ios::in);
- if(!ifs.is_open())
- {
- cout<<"fail to open file."<<endl;
- return;
- }
- Json::Reader reader;
- Json::Value root;
- if(!reader.parse(ifs, root))
- {
- cout<<"fail to parse."<<endl;
- return;
- }
- string s_name;
- int i_age;
- for(int i=0; i<root.size(); ++i)
- {
- s_name = root[i]["name"].asString();
- i_age = root[i]["age"].asInt();
- cout<<"name:"<<s_name.c_str()<<", "<<"age:"<<i_age<<endl;
- }
- }
1. json文件:[{"name":"kanguolai","age":25},{"name":"kanguoqu","age":18}]
2. 生成结果:
四、错误处理
4.1 编译Jsoncpp错误:
1. 现象:C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: 命令“D:\Installed software for develop\jsoncpp-src-0.5.0\makefiles\vs71\../../build/vs71/debug/test_lib_json\test_lib_json.exe
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: :VCEnd”已退出,代码为 9009。
2.解决办法:Jsoncpp放置的目录路径中,不能包含空格。
4.2 编译测试代码错误
1. 现象: error LNK2005: "public: void __thiscall std::_Container_base12::_Orphan_all(void)" (?_Orphan_all@_Container_base12@std@@QAEXXZ) 已经在 msvcprtd.lib(MSVCP100D.dll) 中定义。
等一系列的错误提示。
2. 解决办法:属性 --> C/C++ --> 代码生成 --> 运行库 将其中的 “多线程调试DLL(/MDd)” 改为 “多线程调试(/MTd)” 。
最根本解决办法:在编译Jsoncpp工程前,将其所有工程,由 “多线程调试(/MTd)” 改为 “多线程调试DLL(/MDd)” 。
参考资料:
资料:http://blog.csdn.net/nana08/article/details/6918877
资料与示例:http://www.cnblogs.com/kex1n/archive/2011/12/02/2272328.html
Linux下编译
一、下载Jsoncpp、scons
1.1 下载Jsoncpp
文件名:jsoncpp-src-0.5.0.tar.gz
下载地址:http://sourceforge.net/projects/jsoncpp/
1.2 下载scons
文件名:scons-2.3.0.tar.gz
二、编译Jsoncpp
2.1 解压
将jsoncpp-src-0.5.0.tar.gz、scons-2.3.0.tar.gz拷贝到目录/opt/jsoncpp下,解压缩:
tar zxvf jsoncpp-src-0.5.0.tar.gz
tar axvf scons-2.3.0.tar.gz
2.2 设置环境变量
export MYSCONS=/opt/jsoncpp/scons-2.3.0
export SCONS_LIB_DIR=$MYSCONS/engine
2.3 编译
python $MYSCONS/script/scons platform=linux-gcc
或 python /opt/jsoncpp/scons-2.3.0/script/scons platform=linux-gcc
2.4 生成结果
在目录/opt/jsoncpp/jsoncpp-src-0.5.0/libs/linux-gcc-4.4.6下,生成:
libjson_linux-gcc-4.4.6_libmt.a
libjson_linux-gcc-4.4.6_libmt.so
三、Jsoncpp示例代码
3.1 代码
#include <fstream>
#include <string>
#include "json/json.h"
using namespace std;
#pragma comment(lib,"json_vc71_libmtd.lib")
int main()
{
ifstream ifs;
ifs.open("test.json", ios::out|ios::in);
if(!ifs.is_open())
{
cout<<"fail to open file."<<endl;
return -1;
}
Json::Reader reader;
Json::Value root;
if(!reader.parse(ifs, root))
{
cout<<"fail to parse."<<endl;
return -1;
}
string s_name;
int i_age;
for(int i=0; i<root.size(); ++i)
{
s_name = root[i]["name"].asString();
i_age = root[i]["age"].asInt();
cout<<"name:"<<s_name.c_str()<<", "<<"age:"<<i_age<<endl;
}
return 0;
}
3.2 Makefile文件
PROG := ./testjson
DEPS := .
COMPILE_OPTIONS := \
-I . -I /opt/jsoncpp/jsoncpp-src-0.5.0/include -L /usr/lib64 -L /opt/jsoncpp/jsoncpp-src-0.5.0/libs/linux-gcc-4.4.6 \
-g
LINK_OPTIONS := \
-lstdc++ \
-lrt \
-lpthread \
/opt/jsoncpp/jsoncpp-src-0.5.0/libs/linux-gcc-4.4.6/libjson_linux-gcc-4.4.6_libmt.a
SOURCE := $(shell find $(DEPS) -name "*.cpp") $(shell find $(DEPS) -name "*.c")
OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
CC := g++
CFLAGS := $(COMPILE_OPTIONS)
CPPFLAGS := $(CFLAGS)
$(PROG): $(OBJS)
$(CC) $(CPPFLAGS) $(LDFLAGS) $(OBJS) $(LINK_OPTIONS) -o $@
.PHONY:clean
clean:
-rm -rf $(PROG) $(OBJS) *~
3.3 json文件 与 生成结果
1. json文件:[{"name":"kanguolai","age":25},{"name":"kanguoqu","age":18}]
2. 生成结果: