|

【加入支持库开发QQ群:547525064】
一、使用流程
安装编程环境(必需)
- 安装 VS2017
- 参考这篇博客配置 v141_xp 和 v60 的平台工具集
下载 eDiff 到本地, 这也是一个带了 sdk 的 demo, 可以用 git clone 下载, 也可以注册 gitee 账号然后直接下载压缩包.
下面以 eDiff 的实现过程作为例子来说明 超简单静态支持库开发 的流程.
它将对编译好的 bsdiff 静态库 diff_static.lib 进行封装, 制作一个支持静态编译的支持库.
具体流程
- 打开 VS2017 新建一个项目(路径能不要中文就别中文, 拼音也行啊...)
- 把 3rd 文件夹拷贝到新建的项目的路径下, 和 .vcxproj 文件在同一个目录, 里面有我魔改的 eLib SDK(5.4.1) 和本 demo 要使用的编译好的 bsdiff
-
项目属性(你如果对 VS 比较熟悉当然可以右键, 这里只是为了举例)
-
配置管理器, 用 Release 分别复制两个配置 fne 和 static


- 选中 fne 配置(注意本文全部都是在 Win32 下, 不可能 x64 的), 下面开始进行配置
fne 这里使用 v141_xp 这个平台工具集, 这个平台工具集需要安装 对 C++ 的 Windows XP 支持.
为了不产生不必要的错误, 优化相关全都关掉.
- 添加包含目录, 刚才拷贝的 3rd 里面的 eLib 和 bsdiff 的头文件目录. 这里我写的是相对路径, 当然你也可以写成绝对路径.

- 添加库目录, 刚才拷贝的 3rd 里面的 bsdiff 已经编译好的静态库目录所在的路径.
- 添加依赖的库, 也就是刚才拷贝的 3rd 里面的 bsdiff 已经编译好的静态库.
- 以上设置完毕后, 点击确定. 如下操作唤出 解决方案资源管理器.
- 如图添加 现有项 eLib\fnshare.cpp 和 eLib\eLibEx.cpp 到 解决方案资源管理器 的 源文件 里.
- 如图新建 main.cpp 到 解决方案资源管理器 的 源文件 里, 这将是支持库具体实现的地方. 你当然可以换个文件名, 但是千万不要用中文和全角字符, 因为 vs 虽然支持, 但是 vc6 不支持.
- 先不急着写 main.cpp 的内容, 去完成一下 项目属性 里 fne 的配置.
- 接下来配置 static, 这里我 static 用的是 v60 平台工具集.
-
开始支持库的核心实现, 双击 解决方案资源管理器 的 源文件 中的 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>
-
简单定义一下库的信息
-
写需要导出的命令的具体实现, 如果命令带参数就一起把参数数组写一下, 注意命名, 参数一定要是对应函数的名字跟上 _CommandArgs, 如果没有参数就不用写. 注意参数部分要用 #ifndef __E_STATIC_LIB 和 #endif 包起来.
-
实现都写完了, 然后敲一对 #ifndef __E_STATIC_LIB 和 #endif , 开始在中间写导出.
-
一定要先写 ELIB_DIRTY();
// 必须有
ELIB_DIRTY();
-
然后把刚才实现的的命令导出, 在 void eLib_Init_Cmds() 中用 ADD_CMD、ADD_CMD_EX、ADD_CMD_N0ARGS、ADD_CMD_N0ARGS_EX 实现一句导出支持库命令, 例如
// 在这里添加导出命令
void eLib_Init_Cmds()
{
ADD_CMD(
/* 导出命令 */ JB_bsdiff_patch,
/* 显示名称 */ "bsdiff_patch",
/* 英文名称 */ "bsdiff_patch",
/* 详细解释 */ "详细解释个锤子",
/* 所属类别 */ "JBec",
/* 返回类型 */ SDT_INT
);
};
-
在 void eLib_Init_Types() 中用 ADD_TYPE、ADD_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_CONST、ADD_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);
};
-
如果以上没有问题, 切换一下配置和平台就可以尝试编译, 生成 - 重新生成解决方案
- 分别生成 eDiff.fne 和 eDiff_static.lib 后, 将它们分别拷贝到 \e\lib 和 e\static_lib 目录下, 选择支持库后, 用 e 写一个 demo 即可测试.

|
评分
-
查看全部评分
|