开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 4960|回复: 5
收起左侧

[技术专题] 【简单静态支持库开发】三、利用 VS2017 和开源库 Friso 封装一个简单的支持库 eFriso

[复制链接]
结帖率:100% (26/26)
发表于 2018-6-7 03:03:10 | 显示全部楼层 |阅读模式   海南省三亚市
导语
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 进行动态库的配置:

    • 平台工具集切换到 v60 , 选择动态库
    • 预处理器添加 _CRT_SECURE_NO_WARNINGS
    • 运行库选择 /MT

  • 选择 Release, x86, 生成 - 重新生成解决方案 编译动态链接库, 生成的 Friso.dll 默认在项目文件夹的 Release 目录下.
  • 项目属性, 配置管理器, 下拉然后选择新建, 从 Release 复制一个名为 RelLib 的配置, 切换到 RelLib, 进行静态库的配置:

    • 选择静态库
    • 其它因为复制来的, 所以和 Release 都一样

  • 同样生成 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):

评分

参与人数 1好评 +1 精币 +3 收起 理由
1185384801 + 1 + 3 支持!要是有这么完美的易写易库才好!

查看全部评分


结帖率:52% (12/23)
发表于 2019-6-7 01:22:05 | 显示全部楼层   广东省深圳市
大家能看见图片吗?
其他帖子正常!
回复 支持 反对

使用道具 举报

结帖率:52% (12/23)
发表于 2019-6-7 01:20:33 | 显示全部楼层   广东省深圳市
为什么看不到图片呢
回复 支持 反对

使用道具 举报

发表于 2019-2-11 21:51:36 | 显示全部楼层   河北省承德市
很好不错啊
回复 支持 反对

使用道具 举报

结帖率:100% (5/5)
发表于 2018-6-16 20:39:35 | 显示全部楼层   江苏省盐城市
高大上了,看不懂这个
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 28 天

发表于 2018-6-7 08:39:28 | 显示全部楼层   四川省宜宾市
支持!要是有这么完美的易写易库才好!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表