c++ - 将 C/C++ 源文件作为插件包含在 IL2CPP 中

标签 c++ c unity-game-engine il2cpp

我一直在尝试用 C 语言编写简单的函数,并使用 IL2CPP 将它们直接包含在我的插件目录中,而无需构建 DLL,因为我发现它更简单,并且 P/Invoke 成本更低,并且可能不需要每次进行更改时都重新启动 Unity。

但是当我以独立目标为目标的 IL2CPP 脚本后端时,我总是在播放模式下的编辑器中收到此错误: EntryPointNotFoundException 当我构建时,我得到 /il2cpp.exe did not run properly!

我有 VS2019,带有 C++ 工作负载和 Windows 10 SDK。

有人知道如何在Unity中使用原生源文件和IL2CPP吗?

示例代码:

#include <math.h>
#define EXPORT __declspec(dllexport)

/* Power function*/
EXPORT int power1(int n, int p)
{
    int r = pow(n, p);
    return r;
}

C#

[DllImport("__Internal", EntryPoint ="power1")] static extern int power1(int n, int p);

编辑: 我得到的错误:

Failed running C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp/build/deploy/net471/il2cpp.exe --convert-to-cpp --emit-null-checks --enable-array-bounds-check --dotnetprofile="unityaot" --compile-cpp --libil2cpp-static --platform="WindowsDesktop" --architecture="x86" --configuration="Release" --outputpath="C:\Users\HP\Documents\Unity Projects\C11\Temp/StagingArea/Data\Native\GameAssembly.dll" --cachedirectory="C:\Users\HP\Documents\Unity Projects\C11\Assets\..\Library/il2cpp_cache" --incremental-g-c-time-slice=3 --profiler-report --map-file-parser="C:/Program Files/Unity 2020.1.0a12/Editor/Data/Tools/MapFileParser/MapFileParser.exe" --directory="C:/Users/HP/Documents/Unity Projects/C11/Temp/StagingArea/Data/Managed" --generatedcppdir="C:/Users/HP/Documents/Unity Projects/C11/Temp/StagingArea/Data/il2cppOutput" 

stdout:
Building GameAssembly.dll with MsvcDesktopToolChain
    Msvc Install Version: 15.0
    Msvc Install SDK Directory: C:\Program Files (x86)\Windows Kits\10
    Msvc Linker Path: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\bin\HostX64\x86\link.exe
    Msvc Compiler Path: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\bin\HostX64\x86\cl.exe

    Output directory: C:\Users\HP\Documents\Unity Projects\C11\Temp\StagingArea\Data\Native
    Cache directory: C:\Users\HP\Documents\Unity Projects\C11\Library\il2cpp_cache
il2cpp.exe didn't catch exception: Unity.IL2CPP.Building.BuilderFailedException: plug.c
C:\Users\HP\Documents\Unity Projects\C11\Temp\StagingArea\Data\il2cppOutput\plug.c(4): error C2059: syntax error: 'string'

Invocation was: Executable: "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\bin\HostX64\x86\cl.exe"
Arguments: "C:\Users\HP\Documents\Unity Projects\C11\Temp\StagingArea\Data\il2cppOutput\plug.c" /nologo /c /bigobj /W3 /Zi /EHs /GR- /Gy /utf-8 /wd4102 /wd4800 /wd4056 /wd4190 /wd4723 /wd4467 /wd4503 /wd4996 /wd4200 /Ox /Oi /Oy- /GS- /Gw /GF /Zo /MT /DNET_4_0 /DUNITY_AOT /DIL2CPP_MONO_DEBUGGER_DISABLED /DGC_NOT_DLL /DRUNTIME_IL2CPP /DIL2CPP_ENABLE_WRITE_BARRIERS=1 /DIL2CPP_INCREMENTAL_TIME_SLICE=3 /DBASELIB_INLINE_NAMESPACE=il2cpp_baselib /D_WIN32 /DWIN32 /DWIN32_THREADS /D_WINDOWS /DWINDOWS /D_UNICODE /DUNICODE /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /D_WINSOCK_DEPRECATED_NO_WARNINGS /DNOMINMAX /D_NDEBUG /DNDEBUG /DWINDOWS_SDK_BUILD_VERSION=17763 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\libil2cpp" /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\libil2cpp" /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\external\bdwgc\include" /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\external\xxHash" /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\external\baselib\Include" /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\external\baselib\Platforms\Windows\Include" /I"C:\Users\HP\Documents\Unity Projects\C11\Temp\StagingArea\Data\il2cppOutput" /I"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\winrt" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt" /Fo"C:\Users\HP\Documents\Unity Projects\C11\Library\il2cpp_cache\42917C786FF6C7700329B5FBFAD9962E.obj" /Fd"C:\Users\HP\Documents\Unity Projects\C11\Library\il2cpp_cache\42917C786FF6C7700329B5FBFAD9962E.pdb"
EnvArg key: PATH value: C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64;C:\Program Files (x86)\Windows Kits\10\bin\x64;C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86;C:\Program Files (x86)\Windows Kits\10\bin\x86;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\bin\HostX64\x64

   at Unity.IL2CPP.Building.CppProgramBuilder.BuildAllCppFiles(IEnumerable`1 sourceFilesToCompile, IBuildStatisticsCollector statisticsCollector)
   at Unity.IL2CPP.Building.CppProgramBuilder.Build(IBuildStatistics& statistics)
   at il2cpp.Program.DoRun(String[] args, List`1 foundAssemblies)
   at il2cpp.Program.Run(String[] args, Boolean setInvariantCulture)
   at il2cpp.Program.Main(String[] args)
stderr:

Unhandled Exception: Unity.IL2CPP.Building.BuilderFailedException: plug.c
C:\Users\HP\Documents\Unity Projects\C11\Temp\StagingArea\Data\il2cppOutput\plug.c(4): error C2059: syntax error: 'string'

Invocation was: Executable: "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\bin\HostX64\x86\cl.exe"
Arguments: "C:\Users\HP\Documents\Unity Projects\C11\Temp\StagingArea\Data\il2cppOutput\plug.c" /nologo /c /bigobj /W3 /Zi /EHs /GR- /Gy /utf-8 /wd4102 /wd4800 /wd4056 /wd4190 /wd4723 /wd4467 /wd4503 /wd4996 /wd4200 /Ox /Oi /Oy- /GS- /Gw /GF /Zo /MT /DNET_4_0 /DUNITY_AOT /DIL2CPP_MONO_DEBUGGER_DISABLED /DGC_NOT_DLL /DRUNTIME_IL2CPP /DIL2CPP_ENABLE_WRITE_BARRIERS=1 /DIL2CPP_INCREMENTAL_TIME_SLICE=3 /DBASELIB_INLINE_NAMESPACE=il2cpp_baselib /D_WIN32 /DWIN32 /DWIN32_THREADS /D_WINDOWS /DWINDOWS /D_UNICODE /DUNICODE /D_CRT_SECURE_NO_WARNINGS /D_SCL_SECURE_NO_WARNINGS /D_WINSOCK_DEPRECATED_NO_WARNINGS /DNOMINMAX /D_NDEBUG /DNDEBUG /DWINDOWS_SDK_BUILD_VERSION=17763 /DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\libil2cpp" /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\libil2cpp" /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\external\bdwgc\include" /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\external\xxHash" /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\external\baselib\Include" /I"C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp\external\baselib\Platforms\Windows\Include" /I"C:\Users\HP\Documents\Unity Projects\C11\Temp\StagingArea\Data\il2cppOutput" /I"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\include" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\winrt" /I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt" /Fo"C:\Users\HP\Documents\Unity Projects\C11\Library\il2cpp_cache\42917C786FF6C7700329B5FBFAD9962E.obj" /Fd"C:\Users\HP\Documents\Unity Projects\C11\Library\il2cpp_cache\42917C786FF6C7700329B5FBFAD9962E.pdb"
EnvArg key: PATH value: C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64;C:\Program Files (x86)\Windows Kits\10\bin\x64;C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86;C:\Program Files (x86)\Windows Kits\10\bin\x86;C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.23.28105\bin\HostX64\x64

   at Unity.IL2CPP.Building.CppProgramBuilder.BuildAllCppFiles(IEnumerable`1 sourceFilesToCompile, IBuildStatisticsCollector statisticsCollector)
   at Unity.IL2CPP.Building.CppProgramBuilder.Build(IBuildStatistics& statistics)
   at il2cpp.Program.DoRun(String[] args, List`1 foundAssemblies)
   at il2cpp.Program.Run(String[] args, Boolean setInvariantCulture)
   at il2cpp.Program.Main(String[] args)

UnityEngine.Debug:LogError(Object)
UnityEditorInternal.Runner:RunProgram(Program, String, String, String, CompilerOutputParserBase)
UnityEditorInternal.Runner:RunManagedProgram(String, String, String, CompilerOutputParserBase, Action`1)
UnityEditorInternal.IL2CPPBuilder:RunIl2CppWithArguments(List`1, Action`1, String)
UnityEditorInternal.IL2CPPBuilder:ConvertPlayerDlltoCpp(Il2CppBuildPipelineData, String, String, Boolean)
UnityEditorInternal.IL2CPPBuilder:Run()
UnityEditorInternal.IL2CPPUtils:RunIl2Cpp(String, IIl2CppPlatformProvider, Action`1, RuntimeClassRegistry)
DesktopStandalonePostProcessor:SetupStagingArea(BuildPostProcessArgs, HashSet`1)
DesktopStandalonePostProcessor:PostProcess(BuildPostProcessArgs)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

错误2

Exception: C:\Program Files\Unity 2020.1.0a12\Editor\Data\il2cpp/build/deploy/net471/il2cpp.exe did not run properly!
UnityEditorInternal.Runner.RunProgram (UnityEditor.Utils.Program p, System.String exe, System.String args, System.String workingDirectory, UnityEditor.Scripting.Compilers.CompilerOutputParserBase parser) (at <71e256980c424823a60822d6a2aa03cd>:0)
UnityEditorInternal.Runner.RunManagedProgram (System.String exe, System.String args, System.String workingDirectory, UnityEditor.Scripting.Compilers.CompilerOutputParserBase parser, System.Action`1[T] setupStartInfo) (at <71e256980c424823a60822d6a2aa03cd>:0)
UnityEditorInternal.IL2CPPBuilder.RunIl2CppWithArguments (System.Collections.Generic.List`1[T] arguments, System.Action`1[T] setupStartInfo, System.String workingDirectory) (at <71e256980c424823a60822d6a2aa03cd>:0)
UnityEditorInternal.IL2CPPBuilder.ConvertPlayerDlltoCpp (UnityEditor.Il2Cpp.Il2CppBuildPipelineData data, System.String outputDirectory, System.String workingDirectory, System.Boolean platformSupportsManagedDebugging) (at <71e256980c424823a60822d6a2aa03cd>:0)
UnityEditorInternal.IL2CPPBuilder.Run () (at <71e256980c424823a60822d6a2aa03cd>:0)
UnityEditorInternal.IL2CPPUtils.RunIl2Cpp (System.String stagingAreaData, UnityEditorInternal.IIl2CppPlatformProvider platformProvider, System.Action`1[T] modifyOutputBeforeCompile, UnityEditor.RuntimeClassRegistry runtimeClassRegistry) (at <71e256980c424823a60822d6a2aa03cd>:0)
DesktopStandalonePostProcessor.SetupStagingArea (UnityEditor.Modules.BuildPostProcessArgs args, System.Collections.Generic.HashSet`1[T] filesToNotOverwrite) (at <71e256980c424823a60822d6a2aa03cd>:0)
DesktopStandalonePostProcessor.PostProcess (UnityEditor.Modules.BuildPostProcessArgs args) (at <71e256980c424823a60822d6a2aa03cd>:0)
Rethrow as BuildFailedException: Exception of type 'UnityEditor.Build.BuildFailedException' was thrown.
DesktopStandalonePostProcessor.PostProcess (UnityEditor.Modules.BuildPostProcessArgs args) (at <71e256980c424823a60822d6a2aa03cd>:0)
UnityEditor.Modules.DefaultBuildPostprocessor.PostProcess (UnityEditor.Modules.BuildPostProcessArgs args, UnityEditor.BuildProperties& outProperties) (at <71e256980c424823a60822d6a2aa03cd>:0)
UnityEditor.PostprocessBuildPlayer.Postprocess (UnityEditor.BuildTargetGroup targetGroup, UnityEditor.BuildTarget target, System.String installPath, System.String companyName, System.String productName, System.Int32 width, System.Int32 height, UnityEditor.BuildOptions options, UnityEditor.RuntimeClassRegistry usedClassRegistry, UnityEditor.Build.Reporting.BuildReport report) (at <71e256980c424823a60822d6a2aa03cd>:0)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

最佳答案

您没有发布 Unity 给您的完整错误,所以我猜测您遇到了什么错误...无论哪种情况,这都不起作用,因为:

  1. C# 默认使用 __stdcall 调用约定,而 C/C++ 使用 __cdecl。因此,链接器将无法在链接时找到您的函数,并且会出错。您需要在 P/Invoke 声明或 native 定义上修复它。

  2. 如果您的源文件是 .cpp 文件,则需要将函数标记为 extern "C" 以便编译器不会破坏其名称,因此它可能是 P/调用到。

至于编辑器中的 EntryPointNotFoundException:Unity 编辑器不支持此功能。它仅适用于使用 IL2CPP 脚本后端进行的构建。

关于c++ - 将 C/C++ 源文件作为插件包含在 IL2CPP 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59121758/

相关文章:

unity-game-engine - Unity 中球体位置的经度和纬度

c++ - 指纹调用导致 C++ 中的段错误

c - 在 C 中,!~b 会比 b == 0xff 快吗?

c++ - 无法 #include <string> 在 Visual Studio 2010 中没有很多错误

c - 找到C中的最高位

c - 我如何使用嵌入式 c 向 Telit 调制解调器发出命令?

javascript - Unity WebGL SendMessage 到 Unity 函数错误对象 InGameCanvas/CoilValue 未找到

android - 从 Google Play 商店访问 Google Play 游戏

c++ - 设置种子 boost::随机

c++ - "error: expected constructor, destructor, or type conversion before ' ( ' token"在 memset 调用的位置