Unity3使用IL2CPP方式出包报错Failed running il2cpp.exe

Failed running C:\Program Files\Unity2019.2.8f1\Editor\Data\il2cpp/build/il2cpp.exe --convert-to-cpp --emit-null-checks --enable-array-bounds-check --dotnetprofile=“unityaot” --compile-cpp --libil2cpp-static --platform=“Android” --architecture=“ARMv7” --configuration=“Release” --outputpath=“E:\Adtiming\slots\client\Temp\StagingArea\assets\bin\Data\Native\armeabi-v7a\libil2cpp.so” --cachedirectory=“E:\Adtiming\slots\client\Assets…\Library\il2cpp_android_armeabi-v7a/il2cpp_cache” --additional-include-directories=“C:/Program Files/Unity2019.2.8f1/Editor/Data/PlaybackEngines/AndroidPlayer/Tools\bdwgc/include” --additional-include-directories=“C:/Program Files/Unity2019.2.8f1/Editor/Data/PlaybackEngines/AndroidPlayer/Tools\libil2cpp/include” --tool-chain-path=“E:/softwares/android-ndk-r16b-windows-x86_64/android-ndk-r16b” --profiler-report --map-file-parser=“C:/Program Files/Unity2019.2.8f1/Editor/Data/Tools/MapFileParser/MapFileParser.exe” --directory=E:/Adtiming/slots/client/Temp/StagingArea/assets/bin/Data/Managed --generatedcppdir=E:/Adtiming/slots/client/Temp/StagingArea/Il2Cpp/il2cppOutput

stdout:
Building libil2cpp.so with AndroidToolChain
Output directory: E:\Adtiming\slots\client\Temp\StagingArea\assets\bin\Data\Native\armeabi-v7a
Cache directory: E:\Adtiming\slots\client\Library\il2cpp_android_armeabi-v7a\il2cpp_cache
ObjectFiles: 248 of which compiled: 0
Total compilation time: 142 milliseconds.
il2cpp.exe didn’t catch exception: Unity.IL2CPP.Building.BuilderFailedException: E:\softwares\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++ @“C:\Users\zhouhui\AppData\Local\Temp\tmpACD.tmp” -o “E:\Adtiming\slots\client\Library\il2cpp_android_armeabi-v7a\il2cpp_cache\linkresult_6D95211E8A2D9A549AF8D74E216D94C3\libil2cpp.so” -shared -Wl,-soname,libil2cpp.so -Wl,–no-undefined -Wl,-z,noexecstack -Wl,–gc-sections -Wl,–build-id --sysroot “E:\softwares\android-ndk-r16b-windows-x86_64\android-ndk-r16b\platforms\android-16\arch-arm” -gcc-toolchain “E:\softwares\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64” -target armv7-none-linux-androideabi -Wl,–wrap,sigaction -L “E:\softwares\android-ndk-r16b-windows-x86_64\android-ndk-r16b\sources\cxx-stl\gnu-libstdc++\4.9\libs\armeabi-v7a” -lgnustl_static -latomic -llog -rdynamic -fuse-ld=gold.exe

E:\Adtiming\slots\client\Temp\StagingArea\Il2Cpp\il2cppOutput/Assembly-CSharp4.cpp:34049: error: undefined reference to 'getIPv6’
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)

详细报错路上,重点关注加粗的一句undefined reference to ‘getIPv6’。这是因为使用IL2CPP的方式编译的时候,一些IOS平台的方法在安卓平台没有导致的报错。
在项目中也确实找到如下方法:

    [DllImport("__Internal")]
    private static extern string getIPv6(string mHost, string mPort);
    private static string getIPv6ByCS(string mHost, string mPort)
    {
#if UNITY_IPHONE && !UNITY_EDITOR
		string mIPv6 = getIPv6(mHost, mPort);
		return mIPv6;
#else
        return mHost + "&&ipv4";
#endif
    }

以[DllImport(“__Internal”)]修饰的方法必须在对应平台有对应的c++实现不然就报错
所以可以使用宏修饰该方法。
改正如下:

    #if UNITY_IPHONE && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern string getIPv6(string mHost, string mPort);
    #endif
    private static string getIPv6ByCS(string mHost, string mPort)
    {
#if UNITY_IPHONE && !UNITY_EDITOR
		string mIPv6 = getIPv6(mHost, mPort);
		return mIPv6;
#else
        return mHost + "&&ipv4";
#endif
    }

这样便可以顺利编译了

发布了198 篇原创文章 · 获赞 23 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/iningwei/article/details/104435720