添加 XSuperObject 时项目无法在 iOS 开始
Projects fail to start in iOS when adding XSuperObject
我已经 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 的 "initialization" 中放置了断点,它们都没有停止。
一旦我删除了两个单元,一切又恢复正常了。
这里出了什么问题,我该如何解决?
- X-SuperObject 版本:在报告之前拉取更新from here
- Delphi XE8 版本 22.0.19027.8951(无更新)
- IDE OS: Windows 7 SP1(版本 6.1,内部版本 7601,64 位)
- Mac OS: OS-X 10.10.3
- 目标 OS:iOS 模拟器 - iPad 空气 / iOS 8.2 (12D508)
注意:以上版本详细信息只是一个具体示例,但我无法在任何 iOS device/version.
上使用它
UPDATE: 系统调试后(第115单元初始化),我了解到了异常抛出点。在System.RegularExpressionsCore
第 680 行...
{$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。
我已经更新了我的所有环境,包括 OS-X、XCode、iOS 模拟器和 Delphi IDE 中的 SDK 链接(全部删除并重新创建)。我已验证 SDK 和 iOS 版本完全匹配。但是问题依旧。
请安装 iOS 8 Simulator Hotfix,然后它应该可以正常工作。
我已经 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 的 "initialization" 中放置了断点,它们都没有停止。
一旦我删除了两个单元,一切又恢复正常了。
这里出了什么问题,我该如何解决?
- X-SuperObject 版本:在报告之前拉取更新from here
- Delphi XE8 版本 22.0.19027.8951(无更新)
- IDE OS: Windows 7 SP1(版本 6.1,内部版本 7601,64 位)
- Mac OS: OS-X 10.10.3
- 目标 OS:iOS 模拟器 - iPad 空气 / iOS 8.2 (12D508)
注意:以上版本详细信息只是一个具体示例,但我无法在任何 iOS device/version.
上使用它UPDATE: 系统调试后(第115单元初始化),我了解到了异常抛出点。在System.RegularExpressionsCore
第 680 行...
{$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。
我已经更新了我的所有环境,包括 OS-X、XCode、iOS 模拟器和 Delphi IDE 中的 SDK 链接(全部删除并重新创建)。我已验证 SDK 和 iOS 版本完全匹配。但是问题依旧。
请安装 iOS 8 Simulator Hotfix,然后它应该可以正常工作。