Ich benutze swig, um C# -Wrapper für einige C-Code-Basis zu generieren, die von C# verwendet werden. Wenn ich swig laufen, erzeugt er eine Wrapper c-Datei, die auf die erzeugte PInvoke C# Datei alle Funktionen macht ... Zum Beispiel:Unmanaged C# ruft eine statische Bibliothek auf
// This is in KodLogic_wrap.c
SWIGEXPORT void SWIGSTDCALL CSharp_DMGameMode_timeLimit_set(void * jarg1, unsigned short jarg2) { ... }
// This is in KodLogicPInvoke.cs
[global::System.Runtime.InteropServices.DllImport("KodLogic", EntryPoint="CSharp_DMGameMode_timeLimit_set")]
Dies funktioniert gut, wenn ich ein dynamisches bin Gebäude Bibliothek. Allerdings muss ich jetzt iOS unterstützen, also habe ich eine statische Bibliothek vorbereitet und die Option -dllimport '__Internal'
an swig übergeben, damit das funktioniert.
Leider erhalte ich Fehler Verknüpfung wie:
"_DMGameMode_timeLimit_set", referenced from:
RegisterMonoModules() in RegisterMonoModules.o
(maybe you meant: _CSharp_DMGameMode_timeLimit_set)
der Tat, ich habe meine „CSharp_DMGameMode_timeLimit_set“, aber das ist der Punkt des „Einstiegspunkt“ Argument?
Also, da dieser Fehler durch das Xcode-Projekt Unity ausgelöst wird, bin ich nicht ganz sicher, was die Ursache des Fehlers ist. Schlägt es für statische Bibliotheken fehl? Ist das etwas, das auf der Seite Unity oder swig festgelegt wird?
Update: Nach mehr in diesen Graben, ich glaube, ich habe eine Ahnung von dem, was hier los ist ..
Das Hauptproblem scheint aus dem AOT-Compiler zu sein, die die CS alle zu kompilieren versucht Code zu einer ARM-Assembly. Dies scheint für iOS erforderlich zu sein, daher generiert es während der Unity-AOT-Kompilierung eine Datei RegisterMonoModules.cpp
, die versucht, Zugriffsfunktionen auf den nativen Code zu definieren. RegisterMonoModules.cpp
berücksichtigt nicht den entrepoint-Parameter, der verursacht, dass undefinierte Symbolfehler ausgelöst werden ...
Immer noch versucht, einen richtigen Workaround zu finden.