iosdelphifiremonkeydelphi-xe8xsuperobject

Projects fail to start in iOS when adding XSuperObject


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.

Call Stack

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.RegularExpressionsCoreon 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.


Solution

  • Please install the iOS 8 Simulator Hotfix, then it should work fine.