Tencent/puerts

[UE] Bug: error: no template named 'result_of'

Closed this issue · 2 comments

前置阅读 | Pre-reading

Puer的版本 | Puer Version

Unreal_v1.0.6p1

UE的版本 | UE Version

5.3.2

发生在哪个平台 | Platform

Editor(mac)

错误信息 | Error Message

CompilerResultsLog: ^
CompilerResultsLog: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/stdio.h:180:1: note: 'sprintf' has been explicitly marked deprecated here
CompilerResultsLog: __deprecated_msg("This function is provided for compatibility reasons only. Due to security concerns inherent in the design of sprintf(3), it is highly recommended that you use snprintf(3) instead.")
CompilerResultsLog: ^
CompilerResultsLog: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/sys/cdefs.h:215:48: note: expanded from macro '__deprecated_msg'
CompilerResultsLog: #define __deprecated_msg(_msg) attribute((deprecated(_msg)))
CompilerResultsLog: ^
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/Intermediate/Build/Mac/x64/UnrealEditor/Development/JsEnv/Module.JsEnv.3.cpp:22:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/Source/JsEnv/Private/V8InspectorImpl.cpp:39:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/config/asio_no_tls.hpp:32:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/transport/asio/endpoint.hpp:32:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/transport/asio/connection.hpp:31:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/transport/asio/base.hpp:31:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/common/asio.hpp:52:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio.hpp:38:
CompilerResultsLog: /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio/bind_cancellation_slot.hpp:158:31: error: no template named 'result_of'
CompilerResultsLog: typename void_type<typename result_of<T()>::type>::type>
CompilerResultsLog: ^
CompilerResultsLog: /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio/bind_cancellation_slot.hpp:373:12: error: no template named 'result_of'
CompilerResultsLog: typename result_of<T(Args...)>::type operator()(
CompilerResultsLog: ^
CompilerResultsLog: /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio/bind_cancellation_slot.hpp:381:12: error: no template named 'result_of'
CompilerResultsLog: typename result_of<T(Args...)>::type operator()(
CompilerResultsLog: ^
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/Intermediate/Build/Mac/x64/UnrealEditor/Development/JsEnv/Module.JsEnv.3.cpp:22:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/Source/JsEnv/Private/V8InspectorImpl.cpp:39:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/config/asio_no_tls.hpp:32:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/transport/asio/endpoint.hpp:32:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/transport/asio/connection.hpp:31:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/transport/asio/base.hpp:31:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/common/asio.hpp:52:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio.hpp:39:
CompilerResultsLog: /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio/bind_executor.hpp:198:31: error: no template named 'result_of'
CompilerResultsLog: typename void_type<typename result_of<T()>::type>::type>
CompilerResultsLog: ^
CompilerResultsLog: /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio/bind_executor.hpp:403:12: error: no template named 'result_of'
CompilerResultsLog: typename result_of<T(Args...)>::type operator()(
CompilerResultsLog: ^
CompilerResultsLog: /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio/bind_executor.hpp:411:12: error: no template named 'result_of'
CompilerResultsLog: typename result_of<T(Args...)>::type operator()(
CompilerResultsLog: ^
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/Intermediate/Build/Mac/x64/UnrealEditor/Development/JsEnv/Module.JsEnv.3.cpp:22:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/Source/JsEnv/Private/V8InspectorImpl.cpp:39:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/config/asio_no_tls.hpp:32:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/transport/asio/endpoint.hpp:32:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/transport/asio/connection.hpp:31:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/transport/asio/base.hpp:31:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/websocketpp/websocketpp/common/asio.hpp:52:
CompilerResultsLog: In file included from /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio.hpp:51:
CompilerResultsLog: /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio/co_spawn.hpp:391:16: error: no template named 'result_of'
CompilerResultsLog: typename result_of<F()>::type>::type) CompletionToken
CompilerResultsLog: ^
CompilerResultsLog: /Users/ankye/ue5/puertstest/Plugins/Puerts/ThirdParty/Include/asio/asio/co_spawn.hpp:478:16: error: no template named 'result_of'
CompilerResultsLog: typename result_of<F()>::type>::type) CompletionToken
CompilerResultsLog: ^
CompilerResultsLog: fatal error: too many errors emitted, stopping now [-ferror-limit=]
CompilerResultsLog: 1 warning and 20 errors generated.

问题重现 | Bug reproduce

$ clang --version
Apple clang version 15.0.0 (clang-1500.1.0.2.5)
Target: x86_64-apple-darwin22.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ clang++ --version
Apple clang version 15.0.0 (clang-1500.1.0.2.5)
Target: x86_64-apple-darwin22.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

$ xcodebuild -version
Xcode 15.2
Build version 15C500b

导入插件生成xcode mac工程,构建编译失败
image

这是asio的c++20兼容性问题。
可以在JsEnv.Build.cs指明使用c++17编译。

    public JsEnv(ReadOnlyTargetRules Target) : base(Target)
    {
#if UE_5_3_OR_LATER
        PCHUsage = PCHUsageMode.NoPCHs;
        CppStandard = CppStandardVersion.Cpp17;
#endif

如果还不行,可以先禁用掉调试(只有调试需要用到asio)

    public JsEnv(ReadOnlyTargetRules Target) : base(Target)
    {
#if UE_5_3_OR_LATER
        PCHUsage = PCHUsageMode.NoPCHs;
        PublicDefinitions.Add("WITHOUT_INSPECTOR");;
#endif

后面我升级下asio