开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

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

[技术专题] 【超简单静态支持库开发】一、使用流程 (重发)

[复制链接]
结帖率:100% (26/26)
发表于 2019-3-29 13:01:29 | 显示全部楼层 |阅读模式   安徽省池州市


【加入支持库开发QQ群:547525064】


一、使用流程

安装编程环境(必需)

  • 安装 VS2017
  • 参考这篇博客配置 v141_xp 和 v60 的平台工具集  

下载 eDiff

下载 eDiff 到本地, 这也是一个带了 sdk 的 demo, 可以用 git clone 下载, 也可以注册 gitee 账号然后直接下载压缩包.  

下面以 eDiff 的实现过程作为例子来说明 超简单静态支持库开发 的流程.  

它将对编译好的 bsdiff 静态库 diff_static.lib 进行封装, 制作一个支持静态编译的支持库.  

具体流程

  • 打开 VS2017 新建一个项目(路径能不要中文就别中文, 拼音也行啊...)

2019-01-16-000.png   

2019-01-16-001.png   

  • 3rd 文件夹拷贝到新建的项目的路径下, 和 .vcxproj 文件在同一个目录, 里面有我魔改的 eLib SDK(5.4.1) 和本 demo 要使用的编译好的 bsdiff  

2019-01-16-002.png   

  • 项目属性(你如果对 VS 比较熟悉当然可以右键, 这里只是为了举例)
    2019-01-16-003.png  

  • 配置管理器, 用 Release 分别复制两个配置 fnestatic  

2019-01-16-004.png
2019-01-16-005.png
2019-01-16-006.png

  • 选中 fne 配置(注意本文全部都是在 Win32 下, 不可能 x64 的), 下面开始进行配置  

fne 这里使用 v141_xp 这个平台工具集, 这个平台工具集需要安装 对 C++ 的 Windows XP 支持.   

为了不产生不必要的错误, 优化相关全都关掉.  

2019-01-16-007.png

  • 添加包含目录, 刚才拷贝的 3rd 里面的 eLibbsdiff 的头文件目录. 这里我写的是相对路径, 当然你也可以写成绝对路径.     

2019-01-16-008.png
2019-01-16-009.png  

  • 添加库目录, 刚才拷贝的 3rd 里面的 bsdiff 已经编译好的静态库目录所在的路径.   

2019-01-16-010.png  

  • 添加依赖的库, 也就是刚才拷贝的 3rd 里面的 bsdiff 已经编译好的静态库.  

2019-01-16-011.png  

  • 以上设置完毕后, 点击确定. 如下操作唤出 解决方案资源管理器.  

2019-01-16-012.png  

  • 如图添加 现有项 eLib\fnshare.cppeLib\eLibEx.cpp解决方案资源管理器源文件 里.  

2019-01-16-013.png  

2019-01-16-014.png  

  • 如图新建 main.cpp解决方案资源管理器源文件 里, 这将是支持库具体实现的地方. 你当然可以换个文件名, 但是千万不要用中文和全角字符, 因为 vs 虽然支持, 但是 vc6 不支持.   

2019-01-16-015.png  

2019-01-16-016.png  

  • 先不急着写 main.cpp 的内容, 去完成一下 项目属性fne 的配置.  

2019-01-16-017.png  

  • 配置一下预处理器, 我的如下:

    _CRT_SECURE_NO_WARNINGS
    WIN32
    NDEBUG
    _WINDLL
    _WINDOWS
    _MBCS
    _USRDLL
    _USING_V110_SDK71_

    其中:

    • _USING_V110SDK71v141_xp 平台工具集对应的预处理器.  

2019-01-16-018.png  

2019-01-16-019.png  

  • 接下来配置 static, 这里我 static 用的是 v60 平台工具集.

2019-01-16-031.png  

2019-01-16-032.png  

2019-01-16-033.png  

  • 开始支持库的核心实现, 双击 解决方案资源管理器源文件 中的 main.cpp:

    • 起手先把 eLibEx.h 包含进去  

      #include <eLibEx.h>
    • 再把需要用到的 eLib SDK 的头文件包含进去  

      // 这儿是 e 的 sdk 的头文件
      #include <lib2.h>
      #include <lang.h>
      #include <fnshare.h>
    • 再把需要封装的第三方库的头文件包含进去

      // 这儿是第三方库的头文件
      #include <bzlib.h>
      #include <bsdiff_diff.h>
      #include <bsdiff_patch.h>
    • 简单定义一下库的信息
      2019-01-16-041.png   

    • 写需要导出的命令的具体实现, 如果命令带参数就一起把参数数组写一下, 注意命名, 参数一定要是对应函数的名字跟上 _CommandArgs, 如果没有参数就不用写. 注意参数部分要用 #ifndef __E_STATIC_LIB#endif 包起来.
      2019-01-16-042.png   

    • 实现都写完了, 然后敲一对 #ifndef __E_STATIC_LIB#endif , 开始在中间写导出.  

    • 一定要先写 ELIB_DIRTY();  

      // 必须有
      ELIB_DIRTY();
    • 然后把刚才实现的的命令导出, 在 void eLib_Init_Cmds() 中用 ADD_CMDADD_CMD_EXADD_CMD_N0ARGSADD_CMD_N0ARGS_EX 实现一句导出支持库命令, 例如   

      // 在这里添加导出命令
      void eLib_Init_Cmds() 
      {
      
          ADD_CMD(
              /* 导出命令 */  JB_bsdiff_patch, 
              /* 显示名称 */  "bsdiff_patch",
              /* 英文名称 */  "bsdiff_patch",
              /* 详细解释 */  "详细解释个锤子",
              /* 所属类别 */  "JBec",
              /* 返回类型 */  SDT_INT
          );
      };        
      
    • void eLib_Init_Types() 中用 ADD_TYPEADD_TYPE_EX 实现一句添加支持库数据类型, 例如     

      // 在这里添加自定义数据类型
      void eLib_Init_Types()
      {
          ADD_TYPE(
              /* 显示名称 */  坐标系,
              /* 英文名称 */  "pinyin",
              /* 详细解释 */  "这是坐标系",
              /* 类型成员 */
              {
                  /* 成员类型 */  (DATA_TYPE)SDT_FLOAT,
                  /* 数组成员 */  NULL,
                  /* 显示名称 */  _T("X"),
                  /* 英文名称 */  _T("X"),
                  /* 成员解释 */  _T("X"),
                  /* 枚举类型 */  NULL,
                  /* 默认值   */ 0,
              },
              {
                  /* 成员类型 */  (DATA_TYPE)SDT_FLOAT,
                  /* 数组成员 */  NULL,
                  /* 显示名称 */  _T("Y"),
                  /* 英文名称 */  _T("Y"),
                  /* 成员解释 */  _T("Y"),
                  /* 枚举类型 */  NULL,
                  /* 默认值   */ 0,
              }, );
      
      };        
    • void eLib_Init_Consts() 中用 ADD_CONSTADD_CONST_EX 实现一句添加支持库常量, 例如   

      // 在这里添加常量
      void eLib_Init_Consts() {
      
          ADD_CONST(
          /* 显示名称 */  _WT(LIB_NAME_STR"_BUILD_TIME"), 
          /* 英文名称 */  _WT(LIB_NAME_STR"_BUILD_TIME"), 
          /* 详细解释 */  _WT(LIB_NAME_STR" 的编译时间"), 
          /* 常量布局 */  LVL_HIGH, 
          /* 常量类型 */  CT_TEXT, 
          /* 文本内容 */  GetBuildTime(), 
          /* 数值内容 */  NULL
          );
      };  
    • 切记 ELIB_DIRTY(); 一定要在这几个函数前面.  

    • 接下来在刚才的 #endif 下面再添加几行套路代码, 就完成了   

      #ifndef __E_STATIC_LIB
      // 添加库信息
      EXTERN_C INT WINAPI eLib_ProcessNotifyLib(INT nMsg, DWORD dwParam1, DWORD dwParam2);
      ADD_LIB_INFO();
      #endif // ! __E_STATIC_LIB
      
      //支持库消息处理函数
      EXTERN_C INT WINAPI eLib_ProcessNotifyLib(INT nMsg, DWORD dwParam1, DWORD dwParam2)
      {
      #ifndef __E_STATIC_LIB
      
          if (nMsg == NL_GET_CMD_FUNC_NAMES) // 返回所有命令实现函数的的函数mc数组(char*[]), 支持静态编译的动态库必须处理
              return (INT)eLib_CommandNames();// CommandNames;
          else if (nMsg == NL_GET_NOTIFY_LIB_FUNC_NAME) // 返回处理系统通知的函数mc(PFN_NOTIFY_LIB函数mc), 支持静态编译的动态库必须处理
              return (INT) "eLib_ProcessNotifyLib";
          else if (nMsg == NL_GET_DEPENDENT_LIBS)
              return (INT)NULL;
              // 返回静态库所依赖的其它静态库文件名列表(格式为\0分隔的文本,结尾两个\0), 支持静态编译的动态库必须处理
              // kernel32.lib user32.lib gdi32.lib 等常用的系统库不需要放在此列表中
              // 返回NULL或NR_ERR表示不指定依赖文件
      
      #endif // ! __E_STATIC_LIB
      
          return ProcessNotifyLib(nMsg, dwParam1, dwParam2);
      };
      
  • 如果以上没有问题, 切换一下配置和平台就可以尝试编译, 生成 - 重新生成解决方案

2019-01-16-020.png  

  • 分别生成 eDiff.fneeDiff_static.lib 后, 将它们分别拷贝到 \e\libe\static_lib 目录下, 选择支持库后, 用 e 写一个 demo 即可测试.  

2019-01-16-061.png  

2019-01-16-061.png

评分

参与人数 1好评 +1 精币 +5 收起 理由
冰点 + 1 + 5 奉上小小红包希望笑纳

查看全部评分


结帖率:65% (22/34)
发表于 2019-12-8 12:16:14 | 显示全部楼层   安徽省芜湖市
感谢分享。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2019-9-13 08:13:11 | 显示全部楼层   广东省深圳市

感谢发布原创作品,精易因你更精彩!
回复 支持 反对

使用道具 举报

发表于 2019-5-22 16:31:11 | 显示全部楼层   内蒙古自治区呼伦贝尔市
感谢分享 学习 学习~~!@@!~~!
回复 支持 反对

使用道具 举报

结帖率:78% (14/18)
发表于 2019-4-11 21:45:10 | 显示全部楼层   山东省聊城市
谢谢分享!!
回复 支持 反对

使用道具 举报

结帖率:78% (21/27)
发表于 2019-4-4 11:23:48 | 显示全部楼层   安徽省阜阳市
感谢分享,收藏一下再看
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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