导语Friso 是使用 c 语言开发的一款开源的高性能中文分词器,使用流行的mmseg算法实现。
本文将使用 VS2017 针对 Friso 封装一个简单的支持库, eFriso. 为什么选择 Friso我们知道, e.exe 内部的编译器是低于 vc70 的, 而 Friso 令我们欣喜的地方就在于它完全是一个 ANSI C 的库, 可以非常简单地用 VC60 编译, 于是我将它分别编译成了静态库 Friso.lib 和动态链接库 Friso.dll. 编译 Friso此处简单示范一下 Friso 的编译, 实际上在 C/C++ 中有各种各样的构建, Friso 这种是最简单的, 复杂的构建此处不细说, 我在群文件中分享过一些这方面的书籍, 感兴趣的可以下载来了解一下.
创建一个名为 Friso 的 C++ 空项目. 将下载来的 Friso 的这些源文件复制到刚才创建的项目文件夹下, 并且添加进去. 添加完毕后长这样. 项目属性切换到 Release 进行动态库的配置:
选择 Release, x86, 生成 - 重新生成解决方案 编译动态链接库, 生成的 Friso.dll 默认在项目文件夹的 Release 目录下. 项目属性, 配置管理器, 下拉然后选择新建, 从 Release 复制一个名为 RelLib 的配置, 切换到 RelLib, 进行静态库的配置:
同样生成 RelLib, 编译静态库, 生成的 Friso.lib 默认在项目文件夹的 RelLib 目录下(注意此处的 Friso.lib 要与动态链接库生成时的 Friso.lib 区分).
调用动态库如果是这种动态库静态库都可以简单编译的库, 而你与我一样对 C/C++ 并没有那么熟悉的话, 我是强烈建议先试着用易调用动态库, 能成功调用再去封装静态库. 此处不细谈用易调用动态库的过程, 请学好基础, 并学会看文档. 起手式这个起手式是从一个空项目结合易的 sdk 开始, 实际上开发的时候可以进行一些封装减少重复代码. *.fne 动态库和上文一样创建一个空项目 eFriso, 随便新建一个空白的 main.cpp 项目属性, 新建一个配置名为 fne 对 fne 进行配置:
平台工具集, 配置类型, 后缀名 增加包含目录, 易的 sdk 目录, Friso 需要引入的头文件目录 添加预处理器 _MSC_VER=1200;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG; 运行库选择 /MT 引用静态库
- 忽略一些 warning(程序员眼里没有 warning …) // 忽略的 warning #pragma warning(disable:4838) // 收缩转换 #pragma warning(disable:4005) // 宏重定义 #pragma warning(disable:4044) //
自己加点戏 定义库信息, 就是你在支持库列表中看到那些信息, 注意 guid 每个库都需要生成一个不一样的(为什么下面有一堆 NULL 呢? 你试过就知道了) 声明常量 这种代码就是…正则 excel npp 一把梭
命令实现 命令导出 … (更多直接看项目源码) 点击生成, 会发现报一堆 LNK2001, 也就是找不到符号. 观察到 FRISO_API 被 define 为 extern __declspec(dllexport), 而在调用静态库的时候因为是 cpp, define 为 extern “C” 解决问题, 重新生成 RelLib 得到 Friso.lib, 增加 fne 的预处理器定义 FRISO_LIB, 再生成 fne 解决. 把生成的 eFriso.fne 复制到 e\lib 目录下, 加载支持库, 可以查看到库信息: 编写代码, 测试正常:
*_static.lib 静态库项目属性, 从 fne 复制一份配置, 名为 static.lib 增加 __E_STATIC_LIB 预处理器 附加依赖项 生成, 将生成的 eFriso_static.lib 复制到 e\static_lib 目录下. 成功静态编译测试程序.
总结本文只介绍了制作最简单的静态支持库, 所有的代码都在 main.cpp 里面, 实际上一个好用的支持库肯定不能这么潦草, 仅供参考.
补充内容 (2018-6-9 11:51):
|