E2EE支持库可以通过“伪静态”方式实现程序的[静态编译]。静态编译请使用 [VC6链接器]。
易语言大部分官方支持库和第三方支持库,使用的是VC6进行静态库编译的,而E2EE的部分功能和调用的扩展库,用到了C++11标准,VC6是不支持C++11标准的。为了兼容这些库,所以E2EE使用了“伪静态”在运行时动态释放和调用支持库中的方法。
静态编译后的E2EE程序,会自动释放支持库到系统临时目录下再进行加载。同时也支持从运行目录直接加载支持库。
检测运行目录下是否存在“e2ee.dll”
检测运行目录下是否存在“e2ee.fne”
释放E2EE支持库到系统临时目录下:[临时目录] / E2EECore.[版本号].dll
[成功] 加载
[失败] 检查是否存在同名文件
弹出“加载失败”错误提示
E2EE 2.5 之前的支持库加载顺序,跟上方的 [支持库加载顺序] 刚好倒序。3 > 2 > 1 > 4。
在同一个进程内,永远只会加载一个版本的E2EE支持库。
当您的主程序以及主程序调用的DLL中,同时用到E2EE的功能时,最先加载到的E2EE支持库,将成为内存中唯一版本的E2EE。
假设您的程序和DLL都为静态编译,程序中使用的是“E2EE 2.5”,而调用的DLL中使用的是“E2EE 2.2.3”,当程序先一步载入E2EE的时候,无论是程序还是DLL都将使用程序中的“E2EE 2.5”版本。反之,程序加载完DLL才调用E2EE功能时,都将使用DLL中的“E2EE 2.2.3”版本。
唯一版本功能的作用,是为了保证对象内存结构的统一。如果同一个进程内,存在多版本的E2EE,那么当[存取键值表]等对象在程序和DLL中互相传递时,可能会因为内存布局的差异,导致访问错误的内存数据,间接导致程序崩溃。
易语言的调试机制,无法准确定位到E2EE线程中某些方法,暂时没有好的解决方案。建议善用 键值表 或 列表 等的到文本方法。
e2ee_static.lib(xxx.obj) : error LNK2019: 无法解析的外部符号 "xxx" (xxx),该符号在函数 xxx 中被引用 e2ee_static.lib(xxx.obj) : error LNK2001: 无法解析的外部符号 "xxx" (xxx)
E2EE的静态库使用的是VC6编译的(大部分易语言支持库都是VC6),可能不兼容其它版本链接器的符号表。
LIBC.lib(crt0dat.obj) : error LNK2005: __environ already defined in Libcmt.lib(crt0dat.obj)
用[记事本]打开文件“C:\Program Files (x86)\e\tools\link.ini”
在文件中加入链接器的额外参数
extra_args=/NODEFAULTLIB:"libc.lib"
保存后再次执行“静态编译”即可
库符号命名冲突引起,这里提示的是“LIBC.lib”,如果提示的是其它“lib”文件,用同样的方法把“libc.lib”替换成对应的名称就行。如果是多个“lib”都提示,可以增加多个库忽略参数,例如:
extra_args=/NODEFAULTLIB:"libc.lib" /NODEFAULTLIB:"msvcrt.lib"
在运行静态编译之后的程序时,弹出以下提示:
将易语言“lib”目录下的“e2ee.fne”拷贝到程序的运行目录下即可。
E2EE程序没有权限写出文件到系统的临时目录下。
在运行静态编译之后的程序时,弹出以下提示:
使用黑月静态编译:
其它解决方法:
静态编译使用E2EE开发的程序时,编译器未将E2EE静态库用到的资源部分写入到您的应用程序中,从而导致您的exe、dll无法从程序中加载有效的E2EE支持库。
日志文件被占用
请检查日志文件是否被其它程序占用,如果其它程序打开了日志请先关闭这些程序。
程序没有权限写文件到[日志]目录
给[日志]目录添加文件写入权限。
减少网站“线程数”配置。
线程数过多会导致服务器申请线程失败。正常情况下,建议线程数设置为50~150之间。E2EE2.x开始使用纯异步处理,线程调度和网络处理效率都非常高,而网络传输部分也是纯异步,较少占用线程资源。
线程数最大数不建议超过500。
启动成功后,日志输出“[服务器] 服务器已经关闭”时,只有两种情况:
请检查以下设置是否正常:
[E2EE控制中心]检查端口和IP
确保外网可以访问到您的服务器
检查系统防火墙“IP安全策略”
确认服务器提供商的[安全组]设置里开放了对应的端口
将新版的 e2ee.fne 拷贝到程序目录下。
E2EE为了保证同进程内的支持库版本一致性(保证对象的数据和内存结构完全一致),采取的方式可能在某些环境下会,新的进程会复用内存中已经加载的E2EE支持库,可以通过在程序目录下放入最新版本的E2EE支持库,由于运行目录下的优先级比较高,所以可以保证进程调用的是您指定的版本。