master 分支的源码使用的是 C++ 11 标准,必须用新版本编译器,目前最新版本是 1.9.3。
本文采用的编译器为 C++ Builder 10.2.3 版本。
- 下载 jsoncpp 的 master 分支的源码
- 创建编译静态库 jsoncpp.lib / jsoncpp.a 的项目
- 修改项目选项
- 修改源码
- 编译静态库 jsoncpp.lib / jsoncpp.a
- 下载 jsoncpp-master 1.9.3 (包含项目文件和编译好了的库文件)
以前编译 jsoncpp 1.8.4 版本的时候,没有修改源码,直接就编译通过了,可是现在最新版本 1.9.3 需要新增一些代码,解决兼容问题,希望新版 C++ Builder 要跟上新版 C++ 标准的步伐。当然,jsoncpp 源码也不是百分之百没有问题,放在 std 命名空间里面的 malloc、abort、free、modf 等几个函数没有 using 就直接用了。
一. 下载 jsoncpp 的 master 分支的源码
在 github 上的 jsoncpp 主页上,有 2 个分支:master 和 0.y.z:
master 分支:为 C++ 11 源码,如果用 C++ Builder 需要使用 clang 编译器
0.y.z 分支:早期 C++ 标准,支持老版本的编译器
github 上的 jsoncpp 主页上默认就是 master 分支,下载的源码压缩包为 jsoncpp-master.zip
解压缩之后,jsoncpp-master 文件夹。
在 jsoncpp-master\include\json\version.h 里面可以看到版本。
我下载的是 1.9.3 版本的,就是本文介绍的这个版本。
二. 创建编译静态库 jsoncpp.lib / jsoncpp.a 的项目
打开 C++ Builder,选择菜单 File -> New -> Other...
在打开的创建新项目的对话框里面,左面的目录选择 C++ Builder Projects,右面选择 Static Library,即静态库项目,点击 OK 按钮确认创建新项目,如下图所示:
创建的新项目如下面截图所示:
选择菜单 File -> Save All 或者工具条上的 Save All 按钮 (如上面截图所示位置),把项目保存在源码的项目文件夹里面,如下图示,
在 jsoncpp-master 文件夹里面创建 makefiles 文件夹,makefiles 文件夹里面创建 C++ Builder 10.2.3 文件夹,项目要改名为 jsoncpp.cbproj 保存在这里:
存盘之后的项目文件夹 "jsoncpp-master\makefiles\C++ Builder 10.2.3":
用鼠标右键点击项目管理里面的 jsoncpp.lib 项目,选择 Add... 添加源码:
选择 jsoncpp-master\src\lib_json 里面的 3 个源码文件:
点击 Open 按钮,把源码文件添加到项目:
三. 修改项目选项
添加 Win64 平台:在项目管理里面,鼠标右键点击 Target Platforms,选择 Add Platform...
选择 64-bit Windows:
点击 OK 按钮,把 64-bit Windows 添加到项目:
选择菜单 Project -> Options:
左面目录里面选择 C++ (Shared Options),右面的:
Target 选择 All configuration - All platforms
BPI/LIB output 填入 ..\..\lib\cb
Final output directory 填入 ..\..\lib\cb
_TCHAR maps to 选择 wchar_t
然后点击 Include path 右面的 "..." 按钮:
中间的编辑框输入 ..\..\include
然后点击 Add 按钮:
这个是相对于项目的路径,即 jsoncpp.cbproj 所在的文件夹 "jsoncpp-master\makefiles\C++ Builder 10.2.3" 的上一级的上一级的 include 文件夹,相当于 "jsoncpp-master\include" 文件夹。
可以看到头文件的路径已经添加,点击 OK 按钮确认。
如下面截图所示,可以看到添加的路径,路径之间以分号分割的。
在项目设置左面目录里面找到 Packages 里面的 Runtime Packages,右面的:
Target 选择 All configurations - All platforms
;
Link with runtime packages 选项的打勾去掉
。
如果找不到这个设置选项,说明遇到创建静态库项目的 bug 了,新创建一个 exe 项目,或者打开其他的 exe 项目,关闭之后,再重新创建一个静态库项目,就可能好了。C++ Builder 10.1 之后出现这个 bug,10.0 之前没有这个 bug。
在项目设置左面目录里面找到 C++ Linker,右面的:
Target 选择 All configurations - All platforms
;
Link with Dynamic RTL 选项的打勾去掉
。
如果找不到这个设置选项,一般前面那个 Link with runtime packages 选项也找不到,说明遇到创建静态库项目的 bug 了,新创建一个 exe 项目,或者打开其他的 exe 项目,关闭之后,再重新创建一个静态库项目,就可能好了。C++ Builder 10.1 之后出现这个 bug,10.0 之前没有这个 bug。
在项目设置的左面找到 C++ Compiler,右面的:
Target 选择 All configuration - All platforms
,
Use 'classic' Borland compiler 选项的打勾去掉
。
这个设置是使用新版的 clang 编译器,而不是老版本的 Borland 编译器。
项目设置完成,别忘了点击项目设置对话框底部的 OK 按钮,修改设置生效。
四. 修改源码
1. 修改 json_value.cpp
在第 17 行 #include
#ifdef __BORLANDC__
#include
using std::malloc;
using std::abort;
using std::free;
using std::modf;
#define FP_INFINITE 1 // Positive or negative infinity (overflow)
#define FP_NAN 2 // Not-A-Number
#define FP_ZERO 3 // Value of zero
#define FP_SUBNORMAL 4 // Sub-normal value (underflow)
#define FP_NORMAL 5 // Normal value (none of the above)
namespace std {
double fpclassify(double x)
{
switch(_fpclass(x))
{
case _FPCLASS_SNAN : return FP_NAN; // Signaling NaN
case _FPCLASS_QNAN : return FP_NAN; // Quiet NaN
case _FPCLASS_NINF : return FP_INFINITE; // Negative Infinity
case _FPCLASS_NN : return FP_NORMAL; // Negative Normal
case _FPCLASS_ND : return FP_SUBNORMAL; // Negative Denormal
case _FPCLASS_NZ : return FP_ZERO; // Negative Zero (-0.0)
case _FPCLASS_PZ : return FP_ZERO; // Positive Zero (+0.0)
case _FPCLASS_PD : return FP_SUBNORMAL; // Positive Denormal
case _FPCLASS_PN : return FP_NORMAL; // Positive Normal
case _FPCLASS_PINF : return FP_INFINITE; // Positive Infinity
}
return 0; // Unknown
}
} // namespace std
#endif // __BORLANDC__
添加之后的截图效果如下,红色框内为新增代码:
2. 修改 json_writer.cpp
在第 82 行 #endif 之后添加一段代码:
#ifdef __BORLANDC__
#ifdef isfinite
#undef isfinite
#endif
#ifdef isnan
#undef isnan
#endif
#define isfinite _finite
#define isnan _isnan
#endif // __BORLANDC__
添加之后的截图效果如下,红色框内为新增代码:
五. 编译静态库 jsoncpp.lib / jsoncpp.a
1. 编译 Release 版本的 Win32 静态库 jsoncpp.lib
选择 Release 版本的 32-bit Windows 平台:
在项目管理里面,双击如下截图所示的 Release 和 32-bit Windows,加粗字体表示已经选中:
选择菜单 Project -> Build jsoncpp 或者快捷键 Shift + F9 开始编译。
编译结束,如上面截图所示,对话框的 OK 按钮结束。
可以看到 "jsoncpp-master\lib\cb" 文件夹里面编译生成的 jsoncpp.lib
2. 编译 Release 版本的 Win64 静态库 jsoncpp.a
选择 Release 版本的 64-bit Windows 平台:
在项目管理里面,双击如下截图所示的 Release 和 64-bit Windows,加粗字体表示已经选中:
选择菜单 Project -> Build jsoncpp 或者快捷键 Shift + F9 开始编译。
编译结束,如上面截图所示,对话框的 OK 按钮结束。
可以看到 "jsoncpp-master\lib\cb" 文件夹里面编译生成的 32 位的 jsoncpp.lib 和 64 位的 jsoncpp.a。
六. 下载 jsoncpp-master 1.9.3
请点击:jsoncpp-master-1.9.3-src-cbuilder 下载 jsoncpp-master 1.9.3 源码、C++ Builder 项目文件,编译好了的库文件、例子程序等。
参考:
- C++ Builder 编译 jsoncpp 库 (0.y.z 分支)
- C++ Builder 编译 jsoncpp 库 (master 分支)
- C++ Builder 解析和生成 json (使用 jsoncpp (0.y.z))
- C++ Builder 解析 json,Json::CharReaderBuilder 的使用方法
- C++ Builder 生成 json,Json::StreamWriterBuilder 参数详解
- C++ Builder 遍历 json (使用 jsoncpp)