C++ Builder 编译 jsoncpp 库 (master 分支)

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++ 标准,支持老版本的编译器

选择 master 分支

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 按钮确认创建新项目,如下图所示:

创建 Static Library 静态库项目

创建的新项目如下面截图所示:

创建的新静态库项目,需要 Save All 保存到源码的项目文件夹里面

选择菜单 File -> Save All 或者工具条上的 Save All 按钮 (如上面截图所示位置),把项目保存在源码的项目文件夹里面,如下图示,
在 jsoncpp-master 文件夹里面创建 makefiles 文件夹,makefiles 文件夹里面创建 C++ Builder 10.2.3 文件夹,项目要改名为 jsoncpp.cbproj 保存在这里:

项目改名为 jsoncpp.cbproj

存盘之后的项目文件夹 "jsoncpp-master\makefiles\C++ Builder 10.2.3":

存盘之后的项目文件夹

用鼠标右键点击项目管理里面的 jsoncpp.lib 项目,选择 Add... 添加源码:

用鼠标右键点击项目管理里面的 jsoncpp.lib 项目,选择 Add... 添加源码

选择 jsoncpp-master\src\lib_json 里面的 3 个源码文件:

选择 jsoncpp-master\src\lib_json 里面的 3 个源码文件

点击 Open 按钮,把源码文件添加到项目:

项目管理里面可以看到添加进来的源码文件

三. 修改项目选项

添加 Win64 平台:在项目管理里面,鼠标右键点击 Target Platforms,选择 Add Platform...

鼠标右键点击 Target Platforms,选择 Add Platform...

选择 64-bit Windows:

选择 64-bit Windows

点击 OK 按钮,把 64-bit Windows 添加到项目:

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。

Packages 里面的 Runtime Packages 选项

在项目设置左面目录里面找到 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++ Linker 选项

在项目设置的左面找到 C++ Compiler,右面的:
Target 选择 All configuration - All platforms
Use 'classic' Borland compiler 选项的打勾去掉
这个设置是使用新版的 clang 编译器,而不是老版本的 Borland 编译器。

项目的 C++ Compiler 选项

项目设置完成,别忘了点击项目设置对话框底部的 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,加粗字体表示已经选中:

选择 Release 版本,32-bit Windows 平台

选择菜单 Project -> Build jsoncpp 或者快捷键 Shift + F9 开始编译。

等待编译
编译完成

编译结束,如上面截图所示,对话框的 OK 按钮结束。

编译生成的 jsoncpp.lib

可以看到 "jsoncpp-master\lib\cb" 文件夹里面编译生成的 jsoncpp.lib

2. 编译 Release 版本的 Win64 静态库 jsoncpp.a

选择 Release 版本的 64-bit Windows 平台:
在项目管理里面,双击如下截图所示的 Release 和 64-bit Windows,加粗字体表示已经选中:

Release 版本,64-bit Windows 平台

选择菜单 Project -> Build jsoncpp 或者快捷键 Shift + F9 开始编译。

等待编译
编译结束

编译结束,如上面截图所示,对话框的 OK 按钮结束。

编译生成的 jsoncpp.lib 和 jsoncpp.a

可以看到 "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)

你可能感兴趣的:(C++ Builder 编译 jsoncpp 库 (master 分支))