I've already reported this directly to the X-SuperObject project, but I thought I may get more quality help on Stack Overflow.
Using Delphi XE8, I have issues using XSuperObject on iOS Simulator (7.1, 8.1, 8.2 and 8.3). So I started an empty Firemonkey app, started adding some things which were in my prior project (at this point I didn't know what the issue was). All worked fine up until I added the latest XSuperObject and XSuperJSON units to my app.
uses
XSuperObject, XSuperJSON;
Upon running in the iOS simulator, I get an exception:
Project dyld_sim raised exception class EOSError with message 'System Error. Code: 2. No such file or directory.
I have no code, and have made no changes other than adding units (XSuperObject, XSuperJSON) and a few basic controls (Panel, Button, and Combo Box).
When I break, it takes me to:
System.SysUtils.RaiseLastOSError
- last line raise Error;
...which is just the spot where the actual exception itself was raised, nothing of relevance.
So I opened the main project file and put a break point right on the first line Application.Initialize;
but that break point is never reached. I also put breakpoints in the "initialization" of both XSuperObject and XSuperJSON and neither of them stop either.
Once I removed both units, everything worked again.
What's going wrong here and how do I fix it?
- X-SuperObject Version: Pulled update from here just prior to reporting
- Delphi XE8 Version 22.0.19027.8951 (No Updates)
- IDE OS: Windows 7 SP1 (Version 6.1, Build 7601, 64bit)
- Mac OS: OS-X 10.10.3
- Target OS: iOS Simulator - iPad Air / iOS 8.2 (12D508)
NOTE: Above version details are just one specific example, but I cannot get it to work on any iOS device/version.
UPDATE: After debugging the system (the 115th unit initialization), I came to learn the point where the exception is raised. In System.RegularExpressionsCore
on line 680...
{$IFDEF DYNAMIC_LIB}
class constructor TPerlRegEx.Create;
begin
if not LoadPCRELib then
RaiseLastOSError; //<-- Exception raised here
end;
{$ENDIF DYNAMIC_LIB}
And inside of 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}
While running a project using only this unit, it runs just fine though.
So it seems to be unable to find /usr/lib/libpcre.dylib
, but only if I'm using X-SuperObject.
I've updated all of my environment, including OS-X, XCode, iOS Simulator, and SDK links in Delphi IDE (Deleted all and recreated them). I've verified the SDK and iOS versions all match perfectly. But the problem still persists.
System._StartExe
is callingRaiseLastOSError
? – David Heffernan