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 <utility> 的后面添加一段代码:

#ifdef __BORLANDC__
#include <cfloat>

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 项目文件,编译好了的库文件、例子程序等。


参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容