常见问题
【E2EE文档】

常见问题

目录

 

静态编译

E2EE支持库可以通过“伪静态”方式实现程序的[静态编译]。静态编译请使用 [VC6链接器]。

 

为什么使用“伪静态”?

易语言大部分官方支持库和第三方支持库,使用的是VC6进行静态库编译的,而E2EE的部分功能和调用的扩展库,用到了C++11标准,VC6是不支持C++11标准的。为了兼容这些库,所以E2EE使用了“伪静态”在运行时动态释放和调用支持库中的方法。

 

加载顺序

静态编译后的E2EE程序,会自动释放支持库到系统临时目录下再进行加载。同时也支持从运行目录直接加载支持库。

支持库加载顺序

  1. 检测运行目录下是否存在“e2ee.dll”

    • [存在] 加载
    • [不存在] 跳过
  2. 检测运行目录下是否存在“e2ee.fne”

    • [存在] 加载
    • [不存在] 跳过
  3. 释放E2EE支持库到系统临时目录下:[临时目录] / E2EECore.[版本号].dll

    • [成功] 加载

    • [失败] 检查是否存在同名文件

      • [存在] 加载
      • [不存在] 跳过
  4. 弹出“加载失败”错误提示

E2EE2.5之前的加载顺序

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线程中某些方法,暂时没有好的解决方案。建议善用 键值表 或 列表 等的到文本方法。

 

静态编译提示“error LNK2019”/“error LNK2001”

e2ee_static.lib(xxx.obj) : error LNK2019: 无法解析的外部符号 "xxx" (xxx),该符号在函数 xxx 中被引用 e2ee_static.lib(xxx.obj) : error LNK2001: 无法解析的外部符号 "xxx" (xxx)

解决方法

  1. 将易语言的链接器更换为 VC6Linker
  2. 重新编译

原因分析

E2EE的静态库使用的是VC6编译的(大部分易语言支持库都是VC6),可能不兼容其它版本链接器的符号表。

 

静态编译提示“error LNK2005”

LIBC.lib(crt0dat.obj) : error LNK2005: __environ already defined in Libcmt.lib(crt0dat.obj)

解决方法

  1. 用[记事本]打开文件“C:\Program Files (x86)\e\tools\link.ini”

  2. 在文件中加入链接器的额外参数

    extra_args=/NODEFAULTLIB:"libc.lib"

  3. 保存后再次执行“静态编译”即可

原因分析

库符号命名冲突引起,这里提示的是“LIBC.lib”,如果提示的是其它“lib”文件,用同样的方法把“libc.lib”替换成对应的名称就行。如果是多个“lib”都提示,可以增加多个库忽略参数,例如:

 

运行弹出提示“加载E2EE库失败”

在运行静态编译之后的程序时,弹出以下提示:

  • 加载E2EE库失败

解决方法

将易语言“lib”目录下的“e2ee.fne”拷贝到程序的运行目录下即可。

原因分析

E2EE程序没有权限写出文件到系统的临时目录下。

 

运行弹出提示“无法从资源文件中加载E2EE动态库”

在运行静态编译之后的程序时,弹出以下提示:

  • 无法从资源文件中加载E2EE动态库

解决方法

使用黑月静态编译:

  • 将黑月升级到由网友“被封七号”维护的最新版本。

其它解决方法:

  • 您也可以将易语言“lib”目录下的“e2ee.fne”拷贝到程序的运行目录下直接运行即可。

原因分析

静态编译使用E2EE开发的程序时,编译器未将E2EE静态库用到的资源部分写入到您的应用程序中,从而导致您的exe、dll无法从程序中加载有效的E2EE支持库。

 

服务器问题

 

调试或运行“网站.初始化()”时程序自动关闭并且没有打印任何日志

解决方法

  1. 日志文件被占用

    请检查日志文件是否被其它程序占用,如果其它程序打开了日志请先关闭这些程序。

  2. 程序没有权限写文件到[日志]目录

    给[日志]目录添加文件写入权限。

 

服务器启动时提示”resource unavailable try again“

解决方法

减少网站“线程数”配置。

原因分析

线程数过多会导致服务器申请线程失败。正常情况下,建议线程数设置为50~150之间。E2EE2.x开始使用纯异步处理,线程调度和网络处理效率都非常高,而网络传输部分也是纯异步,较少占用线程资源。

线程数最大数不建议超过500。

 

启动成功后提示”服务器已经关闭”

启动成功后,日志输出“[服务器] 服务器已经关闭”时,只有两种情况:

  • 程序主动调用 [网站服务器.关闭] 方法停止服务器
  • [网站服务器] 对象被回收(可能是局部变量)

 

服务器不能外网访问

请检查以下设置是否正常:

  • [E2EE控制中心]检查端口和IP

    • 通常IP为“*”或“0.0.0.0”表示绑定所有网卡
  • 确保外网可以访问到您的服务器

  • 检查系统防火墙“IP安全策略”

    • 在[入站规则]中加入要开放的端口为[允许]
  • 确认服务器提供商的[安全组]设置里开放了对应的端口

程序启动后总是用的老版本支持库

解决方法

将新版的 e2ee.fne 拷贝到程序目录下。

原因分析

E2EE为了保证同进程内的支持库版本一致性(保证对象的数据和内存结构完全一致),采取的方式可能在某些环境下会,新的进程会复用内存中已经加载的E2EE支持库,可以通过在程序目录下放入最新版本的E2EE支持库,由于运行目录下的优先级比较高,所以可以保证进程调用的是您指定的版本。