Video Sdk Electron demo x64 links error with abseil on windows

Hi, I tried the Zoom Video SDK electron demo these days following the official guidance.

After configuring everything mentioned in the guidance, I just ran npm run electron:serve, it is all ok on Mac, but fails on Windows .

I got these link errors

    正在创建库 D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\Release\zoomvideosdk.lib 和对象 D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\Release\zoomvideosdk.exp
electron_zoomvideosdk.pb.obj : error LNK2001: 无法解析的外部符号 "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > * __cdecl absl::log_internal::MakeCheckOpString<void const *,void const *>(void const *,void const *,char const *)" (??$MakeCheckOpString@PEBXPEBX@log_internal@absl@@YAPEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEBX0PEBD@Z) [D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\zoomvideosdk.vcxproj]
electron_zoomvideosdk.pb.obj : error LNK2001: 无法解析的外部符号 "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > * __cdecl absl::log_internal::MakeCheckOpString<unsigned __int64,unsigned __int64>(unsigned __int64,unsigned __int64,char const *)" (??$MakeCheckOpString@_K_K@log_internal@absl@@YAPEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_K0PEBD@Z) [D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\zoomvideosdk.vcxproj]
electron_zoomvideosdk.pb.obj : error LNK2001: 无法解析的外部符号 "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > * __cdecl absl::log_internal::MakeCheckOpString<__int64,__int64>(__int64,__int64,char const *)" (??$MakeCheckOpString@_J_J@log_internal@absl@@YAPEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@_J0PEBD@Z) [D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\zoomvideosdk.vcxproj]
electron_zoomvideosdk.pb.obj : error LNK2001: 无法解析的外部符号 "public: __cdecl absl::log_internal::LogMessageFatal::~LogMessageFatal(void)" (??1LogMessageFatal@log_internal@absl@@QEAA@XZ) [D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\zoomvideosdk.vcxproj]
electron_zoomvideosdk.pb.obj : error LNK2001: 无法解析的外部符号 "public: __cdecl absl::log_internal::LogMessageFatal::LogMessageFatal(char const *,int,class std::basic_string_view<char,struct std::char_traits<char> >)" (??0LogMessageFatal@log_internal@absl@@QEAA@PEBDHV?$basic_string_view@DU?$char_traits@D@std@@@std@@@Z) [D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\zoomvideosdk.vcxproj]
electron_zoomvideosdk.pb.obj : error LNK2001: 无法解析的外部符号 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > * __cdecl absl::log_internal::CheckOpMessageBuilder::NewString(void)" (?NewString@CheckOpMessageBuilder@log_internal@absl@@QEAAPEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) [D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\zoomvideosdk.vcxproj]
electron_zoomvideosdk.pb.obj : error LNK2001: 无法解析的外部符号 "public: class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl absl::log_internal::CheckOpMessageBuilder::ForVar2(void)" (?ForVar2@CheckOpMessageBuilder@log_internal@absl@@QEAAAEAV?$basic_ostream@DU?$char_traits@D@std@@@std@@XZ) [D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\zoomvideosdk.vcxproj]
electron_zoomvideosdk.pb.obj : error LNK2001: 无法解析的外部符号 "public: __cdecl absl::log_internal::CheckOpMessageBuilder::CheckOpMessageBuilder(char const *)" (??0CheckOpMessageBuilder@log_internal@absl@@QEAA@PEBD@Z) [D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\zoomvideosdk.vcxproj]
electron_zoomvideosdk.pb.obj : error LNK2001: 无法解析的外部符号 "private: void __cdecl absl::log_internal::LogMessage::CopyToEncodedBuffer<0>(class std::basic_string_view<char,struct std::char_traits<char> >)" (??$CopyToEncodedBuffer@$0A@@LogMessage@log_internal@absl@@AEAAXV?$basic_string_view@DU?$char_traits@D@std@@@std@@@Z) [D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\zoomvideosdk.vcxproj]
electron_zoomvideosdk.pb.obj : error LNK2001: 无法解析的外部符号 "public: class absl::log_internal::LogMessage & __cdecl absl::log_internal::LogMessage::operator<<<unsigned __int64,0>(unsigned __int64 const &)" (??$?6_K$0A@@LogMessage@log_internal@absl@@QEAAAEAV012@AEB_K@Z) [D:\workspace\js\zoom-video-sdk-electron-demo-1.10.11\Sample\build\zoomvideosdk.vcxproj]

It sounds like that the protobuf lib missed some symbols’ implementation. I found nothing in bindings.gyp showing linkage with abseil. Was it linked by protobuf.lib?

I would be extremely grateful if someone could give a clue.

Well, I figured out the problem eventually. The protobuf-lite.lib was statically linked with the abseil-cpp with the ABSL_OPTION_INLINE_NAMESPACE_NAME settings to lts_20230802. Symbols in protobuf-lite.lib were under namespace lts_20230802. However, this namespace was not mentioned in the guidance, and the default namespace was used. So when linkage the default namespace symbols were required. To fix it, just change the namespace in Sample/lib/node_add_on/protobuf_src/absl/base/options.h as below.

-#define ABSL_OPTION_USE_INLINE_NAMESPACE 0
-#define ABSL_OPTION_INLINE_NAMESPACE_NAME head
+#define ABSL_OPTION_USE_INLINE_NAMESPACE 1
+#define ABSL_OPTION_INLINE_NAMESPACE_NAME lts_20230802

Or you can compile another protobuf-lite.lib with the default namespace.