Dlopen failure with OnlineSubsystemNull on Mac UE-5.0 Source Build

Plugin ‘OnlineSubsystemUtils’ failed to load because module ‘OnlineSubsystemUtils’ could not be loaded. There may be an operating system error or the module may not be properly set up.

The actual error from dlopen is for some dubious reason hidden by the editor, but after jumping through the hoops to get the editor to log it, here it is:

UnrealEditor[57897:4507623] [UE] LogMac: Warning: dlopen failed: dlopen(UnrealEngine/Engine/Plugins/Online/OnlineSubsystemNull/Binaries/Mac/UnrealEditor-OnlineSubsystemNull.dylib, 0x0005): weak-def symbol not found '__ZN21FOnlineSearchSettings3SetI7FStringEEv5FNameRKT_N19EOnlineComparisonOp4TypeEi’

Output of c++filt:

void FOnlineSearchSettings::Set(FName, FString const&, EOnlineComparisonOp::Type, int)

There is an explicit instantiation of this template in OnlineSearchSettings.cpp which is in the OnlineSubsystem module, so I can’t explain it. Maybe due to circular module dependencies?

1 Like

I found a workaround which was to set EnabledByDefault to false for both the plugins OnlineSubsystemNull and OnlineSubsystemUtils. Bro what?

1 Like

As I searched for help on this today with no luck, I’d like to mention here that in Project fails to load because of the plugin with third party library (macOS) it is mentioned that the error used to appear in the logs (~/Library/Logs → Unreal Engine → MyProjectEditor → MyProject.log)
But for me it does not! (UE5.4)
So for people looking for more detailed help, here is what I had to do:

  1. launch in the debugger (in a console: lldb /Users/Shared/Epic\ Games/UE_5.4/Engine/Binaries/Mac/UnrealEditor.app/Contents/MacOS/UnrealEditor)
  2. break on dlopen
  3. run until the error shows up (can take some time… 135 calls before my module loaded)
  4. check the breakpoint hit count (“breakpoint list”)
  5. delete and re-create the dlopen breakpoint with a condition on the hitcount (a couple hits less to be on the safe side): br dlopen then br modify -i 135
  6. configure lldb with setting set escape-non-printables false to get the full error string
  7. run until the dlopen call that fails, let it execute but no further!
  8. finally you get to see the error using print (char*)dlerror()

hth,