在前面的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
第八课教程下载:教程下载
|