[UE5]The grpc library was redefined in webrtc.lib resulting in LNK2005

Hello,The third-party library in grpc (absl to be precise) was redefined in webrtc.lib of ue5.1 resulting in LNK2005.This is what I do in my own grpc module.

public gRPC(ReadOnlyTargetRules Target) : base(Target)
	{
		Type = ModuleType.External;
        if (Target.Platform == UnrealTargetPlatform.Win64)
        {
            AddEngineThirdPartyPrivateStaticDependencies(Target, "OpenSSL");
            AddEngineThirdPartyPrivateStaticDependencies(Target, "WebRTC");
            AddEngineThirdPartyPrivateStaticDependencies(Target, "zlib");
            PublicIncludePaths.Add(Path.Combine(ThirdPartyPath, "include"));
            string[] LibNameList =
            {
                "absl_bad_optional_access.lib",
                "absl_bad_variant_access.lib",
                "absl_base.lib",
                "absl_city.lib",
                "absl_civil_time.lib",
                "absl_cord.lib",
                "absl_debugging_internal.lib",
                "absl_demangle_internal.lib",
                "absl_exponential_biased.lib",
                "absl_graphcycles_internal.lib",
                "absl_hash.lib",
                "absl_hashtablez_sampler.lib",
                "absl_int128.lib",
                "absl_log_severity.lib",
                "absl_malloc_internal.lib",
                "absl_raw_hash_set.lib",
                "absl_raw_logging_internal.lib",
                "absl_spinlock_wait.lib",
                "absl_stacktrace.lib",
                "absl_status.lib",
                "absl_str_format_internal.lib",
                "absl_strings.lib",
                "absl_strings_internal.lib",
                "absl_symbolize.lib",
                "absl_synchronization.lib",
                "absl_throw_delegate.lib", 
                "absl_time.lib",
                "absl_time_zone.lib",
                "address_sorting.lib",
                "cares.lib",
                "gpr.lib",
                "grpc.lib",
                "grpc_plugin_support.lib",
                "grpc_unsecure.lib",
                "grpc++.lib",
                "grpc++_alts.lib",
                "grpc++_error_details.lib",
                "grpc++_reflection.lib",
                "grpc++_unsecure.lib",
                "grpcpp_channelz.lib",
                "libprotobuf.lib",
                "libprotobuf-lite.lib",
                "libprotoc.lib",
                "re2.lib",
                "upb.lib"
            };
            foreach(var name in LibNameList)
            {
                PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "lib/Win64", name));
            }
            bEnableUndefinedIdentifierWarnings = false;
        }
}

In fact, removing the webrtc module works fine in the editor.But since I need to use the Pixelstreaming plugin, which references the webrtc module when packing, there’s really no way to avoid this.Errors are as follows

2>absl_spinlock_wait.lib(spinlock_wait.obj) : error LNK2005: "int __cdecl absl::base_internal::SpinLockSuggestedDelayNS(int)" (?SpinLockSuggestedDelayNS@base_internal@absl@@YAHH@Z) 已经在 webrtc.lib(spinlock_wait.obj) 中定义
2>absl_spinlock_wait.lib(spinlock_wait.obj) : error LNK2005: "unsigned int __cdecl absl::base_internal::SpinLockWait(struct std::atomic<unsigned int> *,int,struct absl::base_internal::SpinLockWaitTransition const * const,enum absl::base_internal::SchedulingMode)" (?SpinLockWait@base_internal@absl@@YAIPEAU?$atomic@I@std@@HQEBUSpinLockWaitTransition@12@W4SchedulingMode@12@@Z) 已经在 webrtc.lib(spinlock_wait.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: class absl::Cord & __cdecl absl::Cord::operator=(class absl::string_view)" (??4Cord@absl@@QEAAAEAV01@Vstring_view@1@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl absl::operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class absl::Cord const &)" (??6absl@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AEAV12@AEBVCord@0@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: char __cdecl absl::Cord::operator[](unsigned __int64)const " (??ACord@absl@@QEBAD_K@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: __cdecl absl::Cord::operator class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)const " (??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: class absl::Cord::ChunkIterator & __cdecl absl::Cord::ChunkIterator::operator++(void)" (??EChunkIterator@Cord@absl@@QEAAAEAV012@XZ) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: class absl::Cord __cdecl absl::Cord::ChunkIterator::AdvanceAndReadBytes(unsigned __int64)" (?AdvanceAndReadBytes@ChunkIterator@Cord@absl@@AEAA?AV23@_K@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: void __cdecl absl::Cord::ChunkIterator::AdvanceBytesSlowPath(unsigned __int64)" (?AdvanceBytesSlowPath@ChunkIterator@Cord@absl@@AEAAX_K@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: void __cdecl absl::Cord::Append(class absl::Cord &&)" (?Append@Cord@absl@@QEAAX$$QEAV12@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: void __cdecl absl::Cord::Append(class absl::Cord const &)" (?Append@Cord@absl@@QEAAXAEBV12@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: void __cdecl absl::Cord::InlineRep::AssignSlow(class absl::Cord::InlineRep const &)" (?AssignSlow@InlineRep@Cord@absl@@AEAAXAEBV123@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: void __cdecl absl::Cord::Clear(void)" (?Clear@Cord@absl@@QEAAXXZ) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: int __cdecl absl::Cord::Compare(class absl::string_view)const " (?Compare@Cord@absl@@QEBAHVstring_view@2@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: int __cdecl absl::Cord::CompareImpl(class absl::Cord const &)const " (?CompareImpl@Cord@absl@@AEBAHAEBV12@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "void __cdecl absl::CopyCordToString(class absl::Cord const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > *)" (?CopyCordToString@absl@@YAXAEBVCord@1@PEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: void __cdecl absl::Cord::CopyToArraySlowPath(char *)const " (?CopyToArraySlowPath@Cord@absl@@AEBAXPEAD@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: void __cdecl absl::Cord::DestroyCordSlow(void)" (?DestroyCordSlow@Cord@absl@@AEAAXXZ) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: bool __cdecl absl::Cord::EndsWith(class absl::Cord const &)const " (?EndsWith@Cord@absl@@QEBA_NAEBV12@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: bool __cdecl absl::Cord::EndsWith(class absl::string_view)const " (?EndsWith@Cord@absl@@QEBA_NVstring_view@2@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: bool __cdecl absl::Cord::EqualsImpl(class absl::Cord const &,unsigned __int64)const " (?EqualsImpl@Cord@absl@@AEBA_NAEBV12@_K@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: bool __cdecl absl::Cord::EqualsImpl(class absl::string_view,unsigned __int64)const " (?EqualsImpl@Cord@absl@@AEBA_NVstring_view@2@_K@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: static unsigned __int64 __cdecl absl::strings_internal::CordTestAccess::FlatOverhead(void)" (?FlatOverhead@CordTestAccess@strings_internal@absl@@SA_KXZ) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: static unsigned __int64 __cdecl absl::strings_internal::CordTestAccess::FlatTagToLength(unsigned char)" (?FlatTagToLength@CordTestAccess@strings_internal@absl@@SA_KE@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: class absl::string_view __cdecl absl::Cord::FlattenSlowPath(void)" (?FlattenSlowPath@Cord@absl@@AEAA?AVstring_view@2@XZ) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: static void __cdecl absl::Cord::ForEachChunkAux(struct absl::cord_internal::CordRep *,class absl::FunctionRef<void __cdecl(class absl::string_view)>)" (?ForEachChunkAux@Cord@absl@@CAXPEAUCordRep@cord_internal@2@V?$FunctionRef@$$A6AXVstring_view@absl@@@Z@2@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: static bool __cdecl absl::Cord::GetFlatAux(struct absl::cord_internal::CordRep *,class absl::string_view *)" (?GetFlatAux@Cord@absl@@CA_NPEAUCordRep@cord_internal@2@PEAVstring_view@2@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "void __cdecl absl::cord_internal::InitializeCordRepExternal(class absl::string_view,struct absl::cord_internal::CordRepExternal *)" (?InitializeCordRepExternal@cord_internal@absl@@YAXVstring_view@2@PEAUCordRepExternal@12@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: static unsigned char __cdecl absl::strings_internal::CordTestAccess::LengthToTag(unsigned __int64)" (?LengthToTag@CordTestAccess@strings_internal@absl@@SAE_K@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: static unsigned __int64 __cdecl absl::strings_internal::CordTestAccess::MaxFlatLength(void)" (?MaxFlatLength@CordTestAccess@strings_internal@absl@@SA_KXZ) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "private: static unsigned __int64 __cdecl absl::Cord::MemoryUsageAux(struct absl::cord_internal::CordRep const *)" (?MemoryUsageAux@Cord@absl@@CA_KPEBUCordRep@cord_internal@2@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: void __cdecl absl::Cord::Prepend(class absl::Cord const &)" (?Prepend@Cord@absl@@QEAAXAEBV12@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: void __cdecl absl::Cord::Prepend(class absl::string_view)" (?Prepend@Cord@absl@@QEAAXVstring_view@2@@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: void __cdecl absl::Cord::RemovePrefix(unsigned __int64)" (?RemovePrefix@Cord@absl@@QEAAX_K@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: void __cdecl absl::Cord::RemoveSuffix(unsigned __int64)" (?RemoveSuffix@Cord@absl@@QEAAX_K@Z) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: static unsigned __int64 __cdecl absl::strings_internal::CordTestAccess::SizeofCordRepConcat(void)" (?SizeofCordRepConcat@CordTestAccess@strings_internal@absl@@SA_KXZ) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: static unsigned __int64 __cdecl absl::strings_internal::CordTestAccess::SizeofCordRepExternal(void)" (?SizeofCordRepExternal@CordTestAccess@strings_internal@absl@@SA_KXZ) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: static unsigned __int64 __cdecl absl::strings_internal::CordTestAccess::SizeofCordRepSubstring(void)" (?SizeofCordRepSubstring@CordTestAccess@strings_internal@absl@@SA_KXZ) 已经在 webrtc.lib(cord.obj) 中定义
2>absl_cord.lib(cord.obj) : error LNK2005: "public: class absl::Cord __cdecl absl::Cord::Subcord(unsigned __int64,unsigned __int64)const " (?Subcord@Cord@absl@@QEBA?AV12@_K0@Z) 已经在 webrtc.lib(cord.obj) 中定义

Removing absl_cord.lib results in undefined symbols, the hardest part being that only part of what is in absl_cord.lib is redefined in webrtc.lib.So if anyone can solve this problem, or if ue officials can provide the absl library in the engine or provide webrtc.lib compilation information, or if anyone knows how to compile the grpc dll, thank you very much.

An effective way to do this is as follows: Use the lib.exe tool that comes with Visual Studio 2019 to execute the following command.

LIB /REMOVE:obj\third_party\abseil-cpp\absl\base\spinlock_wait\spinlock_wait.obj F:\UE4\UE_5.1\Engine\Source\ThirdParty\WebRTC\4664\Lib\Win64\Release\webrtc.lib

Replace F:\UE4\UE_5.1 with your engine installation directory.Removing spinlock_wait.obj in webrtc.lib that was causing redefinition problems fixed the bug and now I can package correctly.Note that “absl_spinlock_wait.lib” is required.You also need to remove the read-only attribute of webrtc.lib.