开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 5632|回复: 7
收起左侧

[原创视频分享] C语言编写易语言支持库系列课程-更新第八课-静态编译

[复制链接]
发表于 2018-12-14 10:19:35 | 显示全部楼层 |阅读模式   广东省揭阳市

在前面的7节课程中,已经给大家介绍了关于使用C语言开发易语言支持库的一些基本操作,课程连接:C语言编写易语言支持库系列课程(点击打开)
那么现在这一节课将带领大家将编写好的支持库修改为静态库。
那么静态库有什么好处呢?
  • 让你的支持库能够支持“静态编译
  • 静态编译后,体积更小,无依赖文件,运行更稳定
  • 不会再有恼人的:Kernel Library Not Found....(找不到支持库)。提示。

所以接下来我们就看一下如何将一个普通的支持库,改装为静态库。
一般来讲,只需要4步就可以完成。

详细方法请继续往下查看:

首先看一下官方文档中对静态库的一些说明:
易语言5.0“基于第三方链接器的”静态编译方案的核心是:把易语言编译器生成的中间数据,编译成COFF格式的obj文件,然后把它交给第三方链接器,与各支持库的静态库(*.lib文件)一起链接生成EXE/DLL。
为了配合静态编译,易语言编译器、核心支持库、集成开发环境(IDE)均已做出重大更新,绝大多数官方支持库已完成自身改造。

第三方支持库需要作者按照本文介绍的方法完成支持库改造,以便支持静态编译。未经静态编译改造的原有支持库,仍可在新版易语言中使用,只是不能支持静态编译。

一、部分函数需要修改函数名称和符号导出方式
所有命令和方法的实现函数(PFN_EXECUTE_CMD)、处理系统通知的函数(PFN_NOTIFY_LIB),均需要修改函数名称,添加“库名称前缀”,并修改为以C符号形式导出(在C++中使用 extern "C");
所有数据类型的接口获取函数(PFN_GET_INTERFACE),需要统一命名为 <库名称前缀>_GetInterface_<数据类型英文名称>,并修改为以C符号形式导出(在C++中使用 extern "C");非窗口组件数据类型不需要接口获取函数。

修改示例:

void fnMessageBox (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)

     修改为 ↓ ↓ ↓ ↓ ↓

extern "C" void krnln_fnMessageBox (PMDATA_INF pRetData, INT nArgCount, PMDATA_INF pArgInf)


PFN_INTERFACE WINAPI Button_GetInterface (INT nInterfaceNO)

     修改为 ↓ ↓ ↓ ↓ ↓

extern "C" PFN_INTERFACE WINAPI krnln_GetInterface_Button (INT nInterfaceNO)


二、在处理系统通知的函数中返回特定的信息
当通知参数为 NL_GET_CMD_FUNC_NAMES 时,应返回所有命令和方法实现函数的函数名称数组,此数组必须与命令和方法定义数组一一对应,数组各成员均为对应函数的函数名称文本指针(char*);
当通知参数为 NL_GET_NOTIFY_LIB_FUNC_NAME 时,应返回“处理系统通知的函数”(即自身函数)的函数名称(char*);
当通知参数为 NL_GET_DEPENDENT_LIBS 时,应返回“依赖的第三方静态库文件列表”,格式为\0分隔的文本,结尾两个\0。

三、从静态库中去除库定义相关的所有信息
与库定义有关的所有信息,包括命令和方法及其参数的定义信息、命令和方法的实现函数数组(m_pCmdsFunc)、数据类型及其属性事件方法的定义信息、GetNewInf()函数的定义等等,都不应该包含在静态库中。
从静态库中去除这些信息并不是必须的,但如果不去除,往往会造成链接时符号冲突,或导致链接生成的文件过大等一系列问题。
在静态库中,去除全局变量 theApp 的定义,代码中用到它之处,请替换为 AfxGetApp()。如果单纯替换为 AfxGetApp() 不能解决,需自行设法处理。这是必须的。
在静态库中,CWinApp继承类中的初始化和清理代码,可在一个static的全局类变量的构造和析构函数中调用;动态库中在GetNewInf()中的初始化代码,也可用类似方法解决。
在静态库中,应尽量减少导出符号对外部的影响,尽量定义为static符号,或添加自定义前缀。这有助于避免链接时的符号重复定义之类的链接错误。

四、使用符号重命名程序(resym.exe)来处理程序以减少名称冲突。
重命名工具在:易语言正式版\sdk\tools\resym.exe
命令行:"C:\Program Files\e\sdk\tools\resym.exe" all infile="$(TargetPath)" outfile="$(TargetPath)"


VC6.0中的具体操作
  • 在原有支持库VC6工程(.dsw)的基础上,新建一个“Win32 Static Library”项目(.dsp),新项目名称为原项目名称后加"_static"(如 iext3_static)。建议把新项目文件创建在原项目文件旁边(两个项目在同一目录)。
  • 进入创建项目下一步,不选择“Pre-Compiled header”,根据需要确定是否选择“MFC support”(如果暂时不确认,可以先选上,事后再取消)。
  • 为新项目添加预定义宏 __E_STATIC_LIB,并把原项目中的源代码文件都添加进来(VC6文件视图(FileView)中支持 Ctrl+C Ctrl+V)。


具体更多信息请参考:\易语言正式版\sdk\static_docs\index.html

第八课教程下载:教程下载

点评

要是我会C语言,我就不来学易语言了   广东省深圳市  发表于 2019-1-7 17:55

评分

参与人数 1好评 +1 精币 +2 收起 理由
Cand + 1 + 2 感谢分享,很给力!~

查看全部评分


发表于 2019-10-28 18:34:05 | 显示全部楼层   贵州省遵义市
谢谢楼主的分享
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2019-6-28 10:08:22 | 显示全部楼层   新疆维吾尔自治区乌鲁木齐市
有时候老是说静态失败
回复 支持 反对

使用道具 举报

结帖率:53% (10/19)

签到天数: 12 天

发表于 2019-1-25 23:16:07 高大上手机用户 | 显示全部楼层   江苏省常州市
支持支持啊
回复 支持 反对

使用道具 举报

发表于 2019-1-24 00:46:04 | 显示全部楼层   陕西省西安市
谢谢楼主的分享
回复 支持 反对

使用道具 举报

结帖率:75% (6/8)

签到天数: 27 天

发表于 2018-12-18 15:02:44 高大上手机用户 | 显示全部楼层   山东省青岛市
不是不好  其实上c语言我真的不会
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2018-12-17 17:04:35 高大上手机用户 | 显示全部楼层   广东省深圳市
对新人很有帮助的东西
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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