一次Unity3D IL2CPP 打包错误

这篇具有很好参考价值的文章主要介绍了一次Unity3D IL2CPP 打包错误。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、错误描述

二、问题分析

三、解决方法

四、效果验证

五、后记


一、错误描述

采用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

buildfailedexception: incremental player build failed!,学海泛舟,unity

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

二、问题分析

这个程序明明几个月前才编译过,为啥突然不行了,也在网上做了搜索,所得到的回答均不尽如人意,仔细思考,这种情况会不会跟本机环境有关?而容易出问题的地方更多是在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错误后,正确生成程序:

buildfailedexception: incremental player build failed!,学海泛舟,unity

五、后记

在解决这个问题的时候,尝试了非百度的搜索引擎搜索前文中第一个错误,能在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/文章来源地址https://www.toymoban.com/news/detail-780475.html

到了这里,关于一次Unity3D IL2CPP 打包错误的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity2020 打包报错:windowUnity.IL2CPP.Building.BuilderFailedException

    在打包的时候报错:windowUnity.IL2CPP.Building.BuilderFailedException 解决方法:把IL2CPP换成mono,重新打包即可 依次点击:Edit-Player-Configuration-Mono 再次重新打包即可

    2024年02月16日
    浏览(39)
  • 反编译Unity IL2CPP APK:深入探索逆向工程技术

    反编译Unity IL2CPP APK:深入探索逆向工程技术 在移动应用开发领域中,Unity引擎被广泛使用以创建令人惊叹的游戏和应用程序。然而,有时候我们可能需要研究某些应用程序的内部机制或者了解其实现细节。本文将介绍如何反编译基于Unity引擎的IL2CPP APK,并提供相应的源代码和

    2024年02月06日
    浏览(43)
  • Unity WebGL 打包il2cpp.exe did not run properly!

    是中文问题,WebGL的illcpp对执行过程中一点点的中文都不允许存在。包括 硬盘的中文名称 参考 如何更改磁盘盘符的名字 我的文档中的用户名有中文 系统用户名有中文 win+L封锁之后解锁会出现当前系统用户是否有中文 打包路径中有中文 这个很好解决 环境变量中有中文 由于

    2024年02月16日
    浏览(50)
  • 新版UNITY游戏(IL2CPP类型)使用内嵌型机器翻译插件XUnity.AutoTranslator的食用方法

    #新版UNITY游戏(IL2CPP类型)使用内嵌型机器翻译插件XUnity.AutoTranslator的食用方法# 文档更新时间:2022/4/3 20:02:50 网络具备访问github.com的能力 能够进行网页翻译的浏览器(用来查看官方的说明文档),以及耐心 网络能够访问机器翻译服务(谷歌等),如果使用百度需要注册百

    2024年02月09日
    浏览(92)
  • [IL2CPP逆向] 某立志传 - 脱离Steam运行

    喜欢的请支持正版,此版本仅用于学习,不可用于商业目的,请在下载后于24小时内删除。 喜欢的请支持正版,此版本仅用于学习,不可用于商业目的,请在下载后于24小时内删除。 喜欢的请支持正版,此版本仅用于学习,不可用于商业目的,请在下载后于24小时内删除。 重

    2024年02月03日
    浏览(41)
  • Exception: D:\Editor\Data\il2cpp/build/deploy/net471/il2cpp.exe did not run properly!

    问题出现于Unity 2019.4 Windows il2cpp build  问题描述:  原因:由于安装的Window SDK在之前卸载时并未清空注册表中的信息所以再通过注册表信息索引Windows SDK时就会找不到被卸载的SDK。(具体问题描述:Bug - IL2CPP build problem - Unity Forum) 解决: 根据Debug中的提示找到注册表中的条

    2024年02月15日
    浏览(42)
  • 【Unity3D日常开发】Unity3D中协程的使用

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 最近有小伙伴问协程怎么用、怎么写,我也是会用会写,但是原理不是很明白。 学习了一下,总结出

    2024年02月12日
    浏览(54)
  • unity3D基础操作之01--unity3d窗口界面介绍

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 1、Scene场景编辑窗口; 2、Game游戏运行窗口; 3、Hierarchy场景物体列表窗口; 4、Project项目资源列表窗口; 5、Inspector属性编辑列表窗口; 6、其他常调节窗口 在屏幕左上方为场景编辑窗口Scene,在场景编

    2024年02月06日
    浏览(76)
  • 【Unity3D-01】 记录Unity3D调用外接摄像头

    最近想在Unity3D上调用一个摄像头,通过查找资料发现仙魁XAN和八哥快走开的博客符合我的想法,实现起来也不难就尝试了一下 2.1 在这个工程里新建Canvas 如下图所示 然后下设RawImage为载体 2.2 在Assets里面新建一个脚本命名为PlaneManager.cs 代码内容如下(参考八哥快走开的博客)

    2024年02月04日
    浏览(50)
  • 【Unity3D小功能】Unity3D中实现Text显示版本功能

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 大家好,我是佛系工程师 ☆恬静的小魔龙☆ ,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 在项目开发中,会遇到要控制版本的情况,比如说对比版本号,版本不对再更新版本的功能,这些就是

    2024年02月05日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包