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?
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.
Please install the iOS 8 Simulator Hotfix, then it should work fine.