使用源码的方式
到JsonCpp的开源库仓库下载最新的发行版本
解压压缩包
使用Python生成源码文件
在本路径下cmd打开控制台,使用python编译(前提是python环境已安装)
python amalgamate.py
生成dist文件夹
jsoncpp为整合在一起的源码,可以直接放到项目中用
新建jsoncpp源码测试项目JsonCppDemo,在项目目录下新建文件夹jsonsrc
把上面编译出来的文件放到该文件夹下
在VS中右键添加现有项
把头文件和源码放进去项目中
在main函数中引入json.h头文件,使用以下的demo代码进行验证
int main()
{
std::cout << "Hello JsonCpp!\n";
// 创建Json对象
Json::Value root;
// 创建一个Json解析器
Json::Reader reader;
// 需要被转换的Json字符串
std::string test = "{\"name\" : \"Adam\", \"age\" : 20, \"isMarried\" : false}";
// 将Json字符串转换为Json对象
bool parsingSuccessful = reader.parse(test, root);
if (!parsingSuccessful) {
// 如果转换失败,报告错误
std::cout << "Failed to parse JSON : " << reader.getFormattedErrorMessages();
return 1;
}
// 输出转换后的Json对象
std::cout << "Name: " << root["name"].asString() << "\n";
std::cout << "Age: " << root["age"].asInt() << "\n";
std::cout << "isMarried: " << (root["isMarried"].asBool() ? "true" : "false") << "\n";
return 0;
}
成功执行
使用静态库或者动态库的方式
使用CMake生成解决方案
在文件夹路径下cmd打开控制台,使用CMake(CMake环境已安装)生成VS编译器的解决方案,执行以下命令:
cmake -S . -B build -G "Visual Studio 16 2019" 其中,-S . 表示源码在当前目录,-B build表示生成的文件放在当前目录下的build子文件夹中,-G "Visual Studio 16 2019"表示生成适用于2019版的VS 16的解决方案。
最后会在当前目录生成一个build文件夹,进入该文件夹
使用VS 2019打开jsoncpp.sln解决方案
其中有两个工程负责生成lib库
jsoncpp_static工程是负责生成静态lib库文件,jsoncpp_lib工程主要负责生成dll库文件
首先我们来编译生成json
生成静态lib库
鼠标选到jsoncpp_static工程,解决方案配置选release,解决方案平台选x64(根据自己的引用工程进行配置)
右键选择重新生成
从生成的信息中找到生成的静态库lib
使用VS新建静态库测试工程JsonCppStaticLib,把jsoncpp-1.9.5工程下的include文件夹移到JsonCppStaticLib项目的文件夹下
同时在JsonCppStaticLib项目下新建lib文件夹
把上面在jsoncpp编译出来的静态文件放到\lib\x64\release路径下
最好通过路径命名来区别不同编译环境下编译出来的库
右键项目属性,打开"C/C++" -> “常规”,然后在“附加包含目录”中加入头文件所在路徑。
在链接器选项里设置。在"链接器" -> "常规"部分的"附加库目录"填写.lib文件所在的目录。
选择"链接器" -> “输入”,然后在"附加依赖项"那里添加.lib文件
完成后继续使用上面的例子,引入json.h文件,重新编译运行
生成动态dll库
鼠标选到jsoncpp_li工程,解决方案配置选release,解决方案平台选x64(根据自己的引用工程进行配置)
右键重新生成解决方案
可以看到一共生成3个文件jsoncpp.exp,jsoncpp.lib和jsoncpp.dll
.exp文件是导出文件,主要用于动态链接库(DLL)的创建过程中。在创建DLL时,会生成一个.exp文件和一个.lib文件。.exp文件包含了DLL中所有导出函数的信息,而.lib文件是一个导入库文件,用于在编译时链接到对应的DLL; 如果应用程序需要使用DLL中的函数或变量,那么就需要在构建应用程序时链接该.lib文件,然后在运行时,应用程序通过在.exp文件中找到的导出信息,来加载和使用DLL。
可以看得出来,静态库生成的lib比动态库生成的lib大的多
使用VS新建静态库测试工程JsonCppLib,把jsoncpp-1.9.5工程下的include文件夹移到JsonCppLib项目的文件夹下
按照添加静态库的方式
同时在JsonCppLib项目下新建lib文件夹
把上面在jsoncpp编译出来的静态文件放到\lib\x64\release路径下
最好通过路径命名来区别不同编译环境下编译出来的库
右键项目属性,打开"C/C++" -> “常规”,然后在“附加包含目录”中加入头文件所在路徑。
在链接器选项里设置。在"链接器" -> "常规"部分的"附加库目录"填写.lib文件所在的目录。
选择"链接器" -> “输入”,然后在"附加依赖项"那里添加.lib文件
完成后继续使用上面的例子,引入json.h文件,重新编译运行
提示程序运行时缺少dll文件,我们找到生成的可执行文件的位置,把编译出来的dll文件放到同一个文件夹中
这次重新运行
执行成功
问题注意
刚开始编译时出现了编译失败的报错
出现这个问题的原因是项目使用了debug模型,但是jsoncpp_static.lib又是在release下编译出来的,所以用到的项目解决方案配置和平台要保持一致