草庐IT

一次Unity3D IL2CPP 打包错误

Humbunklung 2023-08-23 原文

目录

一、错误描述

二、问题分析

三、解决方法

四、效果验证

五、后记


一、错误描述

采用IL2CPP生成的时候,出现了4个错误:

(1)Building Library\Bee\artifacts\WinPlayerBuildProgram\ei6vj\ku08_i_vm6.lump.obj failed with output:

(2)BuildFailedException: Incremental Player build failed!

(3)Build completed with a result of ‘Failed’ in 19 seconds (18657 ms)

(4)UnityEditor.BuildPlayerWindow+BuildMethodException: 3 errors

之前能成功生成的程序,就这样报错了。

二、问题分析

这个程序明明几个月前才编译过,为啥突然不行了,也在网上做了搜索,所得到的回答均不尽如人意,仔细思考,这种情况会不会跟本机环境有关?而容易出问题的地方更多是在IL转换成C++代码,然后编译生成的过程里,回到前述4个错误,后面3个,更多是描述问题的结果,第1个是问题关键,提示了在编译生成中间文件时出错了。

查看第一个错误:
Building Library\Bee\artifacts\WinPlayerBuildProgram\ei6vj\ku08_i_vm6.lump.obj failed with output:

可看到以下细节(该obj文件名可以是*_vm6.lump.obj,因中间文件名字可能变化):

  1. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(71): error C2039: 'hash_compare': is not a member of 'stdext'
  2. C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.34.31933\include\iterator(1426): note: see declaration of 'stdext'
  3. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(71): error C2065: 'hash_compare': undeclared identifier
  4. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(71): error C2275: 'Key': expected an expression instead of a type
  5. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(38): error C2976: 'Il2CppReaderWriterLockedHashMap': too few template arguments
  6. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(75): note: see declaration of 'Il2CppReaderWriterLockedHashMap'
  7. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(38): error C2974: 'Il2CppReaderWriterLockedHashMap': invalid template argument for 'HashFcn', type expected
  8. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(75): note: see declaration of 'Il2CppReaderWriterLockedHashMap'
  9. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(38): error C2955: 'Il2CppReaderWriterLockedHashMap': use of class template requires template argument list
  10. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(75): note: see declaration of 'Il2CppReaderWriterLockedHashMap'
  11. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(47): error C2955: 'Il2CppReaderWriterLockedHashMap': use of class template requires template argument list
  12. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(75): note: see declaration of 'Il2CppReaderWriterLockedHashMap'
  13. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(385): error C2662: 'bool Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>::TryGet(const Il2CppHashMap<Key,T,HashFcn,EqualKey,Alloc>::key_type &,T *)': cannot convert 'this' pointer from 'PointerTypeMap' to 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc> &'
  14. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(385): note: Reason: cannot convert from 'PointerTypeMap' to 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>'
  15. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(385): note: Conversion requires a second user-defined-conversion operator or constructor
  16. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(90): note: see declaration of 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>::TryGet'
  17. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(385): note: while trying to match the argument list '(Il2CppClass *, Il2CppClass **)'
  18. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(438): error C2662: 'bool Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>::Add(const Il2CppHashMap<Key,T,HashFcn,EqualKey,Alloc>::key_type &,const T &)': cannot convert 'this' pointer from 'PointerTypeMap' to 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc> &'
  19. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(438): note: Reason: cannot convert from 'PointerTypeMap' to 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>'
  20. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(438): note: Conversion requires a second user-defined-conversion operator or constructor
  21. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(102): note: see declaration of 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>::Add'
  22. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(438): note: while trying to match the argument list '(Il2CppClass *, Il2CppClass *)'
  23. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(1157): error C2955: 'Il2CppReaderWriterLockedHashMap': use of class template requires template argument list
  24. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(75): note: see declaration of 'Il2CppReaderWriterLockedHashMap'
  25. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(1157): error C2662: 'Il2CppHashMap<Key,T,HashFcn,EqualKey,Alloc>::iterator Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>::UnlockedBegin(void)': cannot convert 'this' pointer from 'PointerTypeMap' to 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc> &'
  26. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(1157): note: Reason: cannot convert from 'PointerTypeMap' to 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>'
  27. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(1157): note: Conversion requires a second user-defined-conversion operator or constructor
  28. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(121): note: see declaration of 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>::UnlockedBegin'
  29. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(1157): note: while trying to match the argument list '()'
  30. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(1157): error C2662: 'Il2CppHashMap<Key,T,HashFcn,EqualKey,Alloc>::iterator Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>::UnlockedEnd(void)': cannot convert 'this' pointer from 'PointerTypeMap' to 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc> &'
  31. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(1157): note: Reason: cannot convert from 'PointerTypeMap' to 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>'
  32. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(1157): note: Conversion requires a second user-defined-conversion operator or constructor
  33. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\utils\Il2CppHashMap.h(127): note: see declaration of 'Il2CppReaderWriterLockedHashMap<Key,T,HashFcn,EqualKey,Alloc>::UnlockedEnd'
  34. C:\Program Files\Unity\Hub\Editor\2022.1.22f1\Editor\Data\il2cpp\libil2cpp\vm\MetadataCache.cpp(1157): note: while trying to match the argument list '()'
  35. UnityEditor.BuildPlayerWindow:BuildPlayerAndRun ()

排除网上所说的UnityEditor导致的可能后,焦点就落在了STL上了,具体来说就是unordered_map替代hash_map这个问题。hash_map是一个非标准的STL容器,一般来说是要用unordered_map去替代它,但是IL2CPP是机器生成C++代码,修改自动生成代码不太现实,故得从错误忽略着手,如我们常用的宏定义:

#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS

因此,对于Unity3D,我们可以通过添加错误忽略的方法处理。

三、解决方法

(1)环境变量方法(修改_CL_值):

添加环境变量_CL_,变量值为/D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS。在MSVC编译生成的时候加入“/D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS”对

(2)临时改变CL编译选项:

在Unity3D项目中添加C#脚本(可任意位置添加),在预处理生成时,添加C++编译选项
“/D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS”。

  1. #if UNITY_EDITOR
    using System;
    using UnityEditor.Build;
    using UnityEditor.Build.Reporting;
    public class MsvcStdextWorkaround : IPreprocessBuildWithReport
    {
        const string kWorkaroundFlag = "/D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS";
        public int callbackOrder => 0;
        public void OnPreprocessBuild(BuildReport report)
        {
            var clEnv = Environment.GetEnvironmentVariable("_CL_");
            if (string.IsNullOrEmpty(clEnv))
            {
                Environment.SetEnvironmentVariable("_CL_", kWorkaroundFlag);
            }
            else if (!clEnv.Contains(kWorkaroundFlag))
            {
                clEnv += " " + kWorkaroundFlag;
                Environment.SetEnvironmentVariable("_CL_", clEnv);
            }
        }
    }
    #endif // UNITY_EDITOR

四、效果验证

忽略掉hash_map/unorder_map错误后,正确生成程序:

五、后记

在解决这个问题的时候,尝试了非百度的搜索引擎搜索前文中第一个错误,能在Unity3D官网寻找到解决办法。Unity3D官方论坛上说这是微软MSVC编译器(或者说Visual Studio)的一个BUG,但仔细思考,我反而认为问题还是在于应用标准STL容器unordered_map替代hash_map的问题,该问题的产生应该还是出在IL2CPP将Unity3D脚本生成的MSIL汇编转换为C++的过程中,对C#容器采用hash_map来“翻译”而导致。

参考链接:

(1)BUG: Unity 2022.1.22f1 with IL2CPP not working:https://forum.unity.com/threads/unity-2022-1-22f1-with-il2cpp-not-working.1359580/

(2)BUG: IL2CPP error on Building for Windows: https://forum.unity.com/threads/il2cpp-error-on-building-for-windows.1351589/

有关一次Unity3D IL2CPP 打包错误的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  5. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  6. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  7. ruby-on-rails - Rake 任务仅调用一次时执行两次 - 2

    我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里

  8. ruby - 我怎样才能只写一次 "Text"并同时检查 path_info 是否包含 'A' ? - 2

    -if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc

  9. ruby-on-rails - 使用 Ruby 正确处理 Stripe 错误和异常以实现一次性收费 - 2

    我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)

  10. ruby - 如何在 Ruby 中只执行一次方法?有静态变量吗? - 2

    我写了一个脚本,其中包含一些方法定义,没有类和一些公共(public)代码。其中一些方法执行一些非常耗时的shell程序。然而,这些shell程序只需要在第一次调用该方法时执行。现在在C中,我会在每个方法中声明一个静态变量,以确保这些程序只执行一次。我怎么能在Ruby中做到这一点? 最佳答案 ruby中有一个成语:x||=y。defsomething@something||=calculate_somethingendprivatedefcalculate_something#somelongprocessend但是如果您的“长时间

随机推荐