我已经reported this directly to the X-SuperObject project了,但我想我可以在Stack Overflow上获得更多质量帮助。
使用Delphi XE8,我在iOS模拟器(7.1,8.1,8.2和8.3)上使用XSuperObject时遇到了问题。所以我开始了一个空的Firemonkey应用程序,开始添加我之前项目中的一些东西(此时我还不知道问题是什么)。一切正常,直到我将最新的XSuperObject和XSuperJSON单元添加到我的应用程序。
uses
XSuperObject, XSuperJSON;
在iOS模拟器中运行时,我得到一个例外:
Project dyld_sim raised exception class EOSError with message 'System Error. Code: 2. No such file or directory.
我没有代码,除了添加单位(XSuperObject,XSuperJSON)和一些基本控件(面板,按钮和组合框)之外,我没有做任何更改。
当我休息时,它需要我:
System.SysUtils.RaiseLastOSError
- 最后一行raise Error;
......这只是实际异常本身被提出的地方,没有任何相关性。
所以我打开了主项目文件,并在第一行Application.Initialize;
上放置了一个断点,但是从未到达该断点。我还在"初始化"中加入了断点。 XSuperObject和XSuperJSON都没有停止。
一旦我删除了两个单元,一切都恢复了。
这里出了什么问题以及如何解决?
注意:上面的版本细节只是一个具体的例子,但我无法让它在任何iOS设备/版本上运行。
更新:在调试系统(第115单元初始化)之后,我开始学习引发异常的点。在{6}的System.RegularExpressionsCore
...
{$IFDEF DYNAMIC_LIB}
class constructor TPerlRegEx.Create;
begin
if not LoadPCRELib then
RaiseLastOSError; //<-- Exception raised here
end;
{$ENDIF DYNAMIC_LIB}
在LoadPCRELib
...
{$IFDEF DYNAMIC_LIB}
function LoadPCRELib: Boolean;
function GetProcAddr(const ProcName: MarshaledAString): Pointer;
begin
dlerror;
Result := dlsym(_PCRELib, ProcName);
end;
procedure SetCallback(const cbName: MarshaledAString; ProcPointer: Pointer);
begin
Pointer(GetProcAddr(cbName)^) := ProcPointer;
end;
begin
Result := True;
if _PCRELib = 0 then
begin
Result := False;
_PCRELib := HMODULE(dlopen(PCRELib, RTLD_LAZY)); //<-- Returns 0 (no handle)
if _PCRELib <> 0 then
begin
// Setup the function pointers
...
Result := True;
end;
end;
end;
{$ENDIF}
在仅使用此单元运行项目时,它运行得很好。
所以似乎无法找到/usr/lib/libpcre.dylib
,但前提是我使用的是X-SuperObject。
我已经更新了我的所有环境,包括Delphi IDE中的OS-X,XCode,iOS模拟器和SDK链接(全部删除并重新创建)。我已经验证了SDK和iOS版本都完美匹配。但问题仍然存在。