Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cannot Compile with libtorch #966

Open
mcc311 opened this issue Nov 21, 2022 · 6 comments
Open

Cannot Compile with libtorch #966

mcc311 opened this issue Nov 21, 2022 · 6 comments
Labels
contribution welcome It's a nice feature! But we do not have the time to do it ourselves. Contribution welcomed! help wanted Extra attention is needed

Comments

@mcc311
Copy link

mcc311 commented Nov 21, 2022

Hi, I met few problems when I try to compile with librtorch.
I can use this Open Spiel without libtorch correctly, but when I:

  1. Turn on 'BUILD_WITH_LIBTORCH' and 'BUILD_WITH_LIBNOP'
  2. run ./install.sh # download libtorch
  3. run ./open_spiel/script/build_and_run_tests.sh
    And I met these errors: Full Version
...
/usr/bin/ld: CMakeFiles/alpha_zero_torch_example.dir/alpha_zero_torch_example.cc.o: in function `main':
alpha_zero_torch_example.cc:(.text+0x8b0): undefined reference to `open_spiel::file::File::File(std::string const&, std::string const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text+0x8f1): undefined reference to `open_spiel::file::File::ReadContents()'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text+0xeb2): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text+0xf0d): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text+0xf1a): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch_example.dir/alpha_zero_torch_example.cc.o: in function `void* absl::flags_internal::FlagOps<std::string>(absl::flags_internal::FlagOp, void const*, void*, void*)':
alpha_zero_torch_example.cc:(.text._ZN4absl14flags_internal7FlagOpsISsEEPvNS0_6FlagOpEPKvS2_S2_[_ZN4absl14flags_internal7FlagOpsISsEEPvNS0_6FlagOpEPKvS2_S2_]+0x11f): undefined reference to `absl::flags_internal::AbslUnparseFlag(std::basic_string_view<char, std::char_traits<char> >)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN4absl14flags_internal7FlagOpsISsEEPvNS0_6FlagOpEPKvS2_S2_[_ZN4absl14flags_internal7FlagOpsISsEEPvNS0_6FlagOpEPKvS2_S2_]+0x1a1): undefined reference to `absl::flags_internal::AbslParseFlag(std::basic_string_view<char, std::char_traits<char> >, std::string*, std::string*)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch_example.dir/alpha_zero_torch_example.cc.o: in function `void* absl::flags_internal::FlagOps<int>(absl::flags_internal::FlagOp, void const*, void*, void*)':
alpha_zero_torch_example.cc:(.text._ZN4absl14flags_internal7FlagOpsIiEEPvNS0_6FlagOpEPKvS2_S2_[_ZN4absl14flags_internal7FlagOpsIiEEPvNS0_6FlagOpEPKvS2_S2_]+0x70): undefined reference to `absl::flags_internal::AbslParseFlag(std::basic_string_view<char, std::char_traits<char> >, int*, std::string*)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN4absl14flags_internal7FlagOpsIiEEPvNS0_6FlagOpEPKvS2_S2_[_ZN4absl14flags_internal7FlagOpsIiEEPvNS0_6FlagOpEPKvS2_S2_]+0x8e): undefined reference to `absl::flags_internal::Unparse(int)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch_example.dir/alpha_zero_torch_example.cc.o: in function `void* absl::flags_internal::FlagOps<double>(absl::flags_internal::FlagOp, void const*, void*, void*)':
alpha_zero_torch_example.cc:(.text._ZN4absl14flags_internal7FlagOpsIdEEPvNS0_6FlagOpEPKvS2_S2_[_ZN4absl14flags_internal7FlagOpsIdEEPvNS0_6FlagOpEPKvS2_S2_]+0x7b): undefined reference to `absl::flags_internal::AbslParseFlag(std::basic_string_view<char, std::char_traits<char> >, double*, std::string*)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN4absl14flags_internal7FlagOpsIdEEPvNS0_6FlagOpEPKvS2_S2_[_ZN4absl14flags_internal7FlagOpsIdEEPvNS0_6FlagOpEPKvS2_S2_]+0x9f): undefined reference to `absl::flags_internal::Unparse(double)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch_example.dir/alpha_zero_torch_example.cc.o: in function `void* absl::flags_internal::FlagOps<bool>(absl::flags_internal::FlagOp, void const*, void*, void*)':
alpha_zero_torch_example.cc:(.text._ZN4absl14flags_internal7FlagOpsIbEEPvNS0_6FlagOpEPKvS2_S2_[_ZN4absl14flags_internal7FlagOpsIbEEPvNS0_6FlagOpEPKvS2_S2_]+0x73): undefined reference to `absl::flags_internal::AbslParseFlag(std::basic_string_view<char, std::char_traits<char> >, bool*, std::string*)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN4absl14flags_internal7FlagOpsIbEEPvNS0_6FlagOpEPKvS2_S2_[_ZN4absl14flags_internal7FlagOpsIbEEPvNS0_6FlagOpEPKvS2_S2_]+0x92): undefined reference to `absl::flags_internal::Unparse(bool)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch_example.dir/alpha_zero_torch_example.cc.o: in function `open_spiel::algorithms::torch_az::AlphaZeroConfig::FromJson(std::map<std::string, open_spiel::json::Value, std::less<std::string>, std::allocator<std::pair<std::string const, open_spiel::json::Value> > > const&)':
alpha_zero_torch_example.cc:(.text._ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE[_ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE]+0x16ef): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE[_ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE]+0x16f9): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE[_ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE]+0x1737): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE[_ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE]+0x1741): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE[_ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE]+0x177f): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE[_ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE]+0x1789): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE[_ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE]+0x17c7): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE[_ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE]+0x17d1): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE[_ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE]+0x180f): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE[_ZN10open_spiel10algorithms8torch_az15AlphaZeroConfig8FromJsonERKSt3mapISsNS_4json5ValueESt4lessISsESaISt4pairIKSsS5_EEE]+0x1819): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch_example.dir/alpha_zero_torch_example.cc.o: in function `open_spiel::json::Value::GetInt() const':
alpha_zero_torch_example.cc:(.text._ZNK10open_spiel4json5Value6GetIntEv[_ZNK10open_spiel4json5Value6GetIntEv]+0x6a): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZNK10open_spiel4json5Value6GetIntEv[_ZNK10open_spiel4json5Value6GetIntEv]+0x72): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch_example.dir/alpha_zero_torch_example.cc.o: in function `open_spiel::json::Value::GetBool() const':
alpha_zero_torch_example.cc:(.text._ZNK10open_spiel4json5Value7GetBoolEv[_ZNK10open_spiel4json5Value7GetBoolEv]+0x69): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZNK10open_spiel4json5Value7GetBoolEv[_ZNK10open_spiel4json5Value7GetBoolEv]+0x71): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch_example.dir/alpha_zero_torch_example.cc.o: in function `open_spiel::json::Value::GetDouble() const':
alpha_zero_torch_example.cc:(.text._ZNK10open_spiel4json5Value9GetDoubleEv[_ZNK10open_spiel4json5Value9GetDoubleEv]+0x6b): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero_torch_example.cc:(.text._ZNK10open_spiel4json5Value9GetDoubleEv[_ZNK10open_spiel4json5Value9GetDoubleEv]+0x73): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: CMakeFiles/torch_vpnet_test.dir/vpnet_test.cc.o: in function `main':
vpnet_test.cc:(.text+0x118): undefined reference to `open_spiel::LoadGame(std::string const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x969): undefined reference to `open_spiel::LoadGame(std::string const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x12cc): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: vpnet_test.cc:(.text+0x16f2): undefined reference to `open_spiel::LoadGame(std::string const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x1919): undefined reference to `open_spiel::LoadGame(std::string const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x1ad1): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: vpnet_test.cc:(.text+0x2234): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x22ad): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x234a): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x23c0): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x2436): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: CMakeFiles/torch_vpnet_test.dir/vpnet_test.cc.o:vpnet_test.cc:(.text+0x24ac): more undefined references to `open_spiel::SpielFatalError(std::string const&)' follow
/usr/bin/ld: CMakeFiles/torch_vpnet_test.dir/vpnet_test.cc.o: in function `open_spiel::algorithms::torch_az::(anonymous namespace)::BuildModel(open_spiel::Game const&, std::string const&, bool)':
vpnet_test.cc:(.text+0x2dae): undefined reference to `open_spiel::file::GetTmpDir()'
/usr/bin/ld: vpnet_test.cc:(.text+0x2e0b): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x2f0b): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x2f15): undefined reference to `open_spiel::file::Exists(std::string const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x316b): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: vpnet_test.cc:(.text+0x31b3): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: CMakeFiles/torch_model_test.dir/model_test.cc.o: in function `main':
model_test.cc:(.text+0xc2): undefined reference to `open_spiel::LoadGame(std::string const&)'
/usr/bin/ld: model_test.cc:(.text+0x438): undefined reference to `absl::strings_internal::CatPieces(std::initializer_list<std::basic_string_view<char, std::char_traits<char> > >)'
/usr/bin/ld: model_test.cc:(.text+0x479): undefined reference to `open_spiel::LoadGame(std::string const&)'
/usr/bin/ld: model_test.cc:(.text+0x148f): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: model_test.cc:(.text+0x14f5): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: model_test.cc:(.text+0x157c): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: model_test.cc:(.text+0x15e2): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: model_test.cc:(.text+0x1648): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::StartInfoFromLearnerJson(std::string const&)':
alpha_zero.cc:(.text+0xb9): undefined reference to `open_spiel::file::File::File(std::string const&, std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0xf4): undefined reference to `open_spiel::file::File::ReadContents()'
/usr/bin/ld: alpha_zero.cc:(.text+0x901): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x90e): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::PlayGame(open_spiel::Logger*, int, open_spiel::Game const&, std::vector<std::unique_ptr<open_spiel::algorithms::MCTSBot, std::default_delete<open_spiel::algorithms::MCTSBot> >, std::allocator<std::unique_ptr<open_spiel::algorithms::MCTSBot, std::default_delete<open_spiel::algorithms::MCTSBot> > > >*, std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul>*, double, int, double, bool)':
alpha_zero.cc:(.text+0x10fa): undefined reference to `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::string>(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)'
/usr/bin/ld: alpha_zero.cc:(.text+0x111f): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x13ba): undefined reference to `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::string>(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)'
/usr/bin/ld: alpha_zero.cc:(.text+0x13f6): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::actor(open_spiel::Game const&, open_spiel::algorithms::torch_az::AlphaZeroConfig const&, int, open_spiel::ThreadedQueue<open_spiel::algorithms::torch_az::Trajectory>*, std::shared_ptr<open_spiel::algorithms::torch_az::VPNetEvaluator>, open_spiel::StopToken*)':
alpha_zero.cc:(.text+0x1860): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::evaluator(open_spiel::Game const&, open_spiel::algorithms::torch_az::AlphaZeroConfig const&, int, open_spiel::algorithms::torch_az::EvalResults*, std::shared_ptr<open_spiel::algorithms::torch_az::VPNetEvaluator>, open_spiel::StopToken*)':
alpha_zero.cc:(.text+0x21b3): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x2847): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::learner(open_spiel::Game const&, open_spiel::algorithms::torch_az::AlphaZeroConfig const&, open_spiel::algorithms::torch_az::DeviceManager*, std::shared_ptr<open_spiel::algorithms::torch_az::VPNetEvaluator>, open_spiel::ThreadedQueue<open_spiel::algorithms::torch_az::Trajectory>*, open_spiel::algorithms::torch_az::EvalResults*, open_spiel::StopToken*, open_spiel::algorithms::torch_az::StartInfo const&)':
alpha_zero.cc:(.text+0x2f21): undefined reference to `open_spiel::DataLoggerJsonLines::DataLoggerJsonLines(std::string const&, std::string const&, bool, std::string const&, absl::Time)'
/usr/bin/ld: alpha_zero.cc:(.text+0x30c7): undefined reference to `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::string>(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)'
/usr/bin/ld: alpha_zero.cc:(.text+0x30f9): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x4118): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x42bb): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x4896): undefined reference to `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::string>(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)'
/usr/bin/ld: alpha_zero.cc:(.text+0x48cb): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x5f25): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x607a): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x6600): undefined reference to `open_spiel::DataLoggerJsonLines::Write(std::map<std::string, open_spiel::json::Value, std::less<std::string>, std::allocator<std::pair<std::string const, open_spiel::json::Value> > >)'
/usr/bin/ld: CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::AlphaZero(open_spiel::algorithms::torch_az::AlphaZeroConfig, open_spiel::StopToken*, bool)':
alpha_zero.cc:(.text+0x7da8): undefined reference to `open_spiel::LoadGame(std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x7e07): undefined reference to `open_spiel::file::Mkdirs(std::string const&, int)'
/usr/bin/ld: alpha_zero.cc:/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::StartInfoFromLearnerJson(std::string const&)':
alpha_zero.cc:(.text+0xb9): undefined reference to `open_spiel::file::File::File(std::string const&, std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0xf4): undefined reference to `open_spiel::file::File::ReadContents()'
/usr/bin/ld: alpha_zero.cc:(.text+0x901): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x90e): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::PlayGame(open_spiel::Logger*, int, open_spiel::Game const&, std::vector<std::unique_ptr<open_spiel::algorithms::MCTSBot, std::default_delete<open_spiel::algorithms::MCTSBot> >, std::allocator<std::unique_ptr<open_spiel::algorithms::MCTSBot, std::default_delete<open_spiel::algorithms::MCTSBot> > > >*, std::mersenne_twister_engine<unsigned long, 32ul, 624ul, 397ul, 31ul, 2567483615ul, 11ul, 4294967295ul, 7ul, 2636928640ul, 15ul, 4022730752ul, 18ul, 1812433253ul>*, double, int, double, bool)':
alpha_zero.cc:(.text+0x10fa): undefined reference to `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::string>(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)'
/usr/bin/ld: alpha_zero.cc:(.text+0x111f): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x13ba): undefined reference to `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::string>(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)'
/usr/bin/ld: alpha_zero.cc:(.text+0x13f6): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::actor(open_spiel::Game const&, open_spiel::algorithms::torch_az::AlphaZeroConfig const&, int, open_spiel::ThreadedQueue<open_spiel::algorithms::torch_az::Trajectory>*, std::shared_ptr<open_spiel::algorithms::torch_az::VPNetEvaluator>, open_spiel::StopToken*)':
alpha_zero.cc:(.text+0x1860): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::evaluator(open_spiel::Game const&, open_spiel::algorithms::torch_az::AlphaZeroConfig const&, int, open_spiel::algorithms::torch_az::EvalResults*, std::shared_ptr<open_spiel::algorithms::torch_az::VPNetEvaluator>, open_spiel::StopToken*)':
alpha_zero.cc:(.text+0x21b3): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x2847): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::learner(open_spiel::Game const&, open_spiel::algorithms::torch_az::AlphaZeroConfig const&, open_spiel::algorithms::torch_az::DeviceManager*, std::shared_ptr<open_spiel::algorithms::torch_az::VPNetEvaluator>, open_spiel::ThreadedQueue<open_spiel::algorithms::torch_az::Trajectory>*, open_spiel::algorithms::torch_az::EvalResults*, open_spiel::StopToken*, open_spiel::algorithms::torch_az::StartInfo const&)':
alpha_zero.cc:(.text+0x2f21): undefined reference to `open_spiel::DataLoggerJsonLines::DataLoggerJsonLines(std::string const&, std::string const&, bool, std::string const&, absl::Time)'
/usr/bin/ld: alpha_zero.cc:(.text+0x30c7): undefined reference to `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::string>(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)'
/usr/bin/ld: alpha_zero.cc:(.text+0x30f9): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x4118): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x42bb): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x4896): undefined reference to `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::string>(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)'
/usr/bin/ld: alpha_zero.cc:(.text+0x48cb): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x5f25): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x607a): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text+0x6600): undefined reference to `open_spiel::DataLoggerJsonLines::Write(std::map<std::string, open_spiel::json::Value, std::less<std::string>, std::allocator<std::pair<std::string const, open_spiel::json::Value> > >)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::algorithms::torch_az::AlphaZero(open_spiel::algorithms::torch_az::AlphaZeroConfig, open_spiel::StopToken*, bool)':
alpha_zero.cc:(.text+0x7da8): undefined reference to `open_spiel::LoadGame(std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x7e07): undefined reference to `open_spiel::file::Mkdirs(std::string const&, int)'
/usr/bin/ld: alpha_zero.cc:(.text+0x7e11): undefined reference to `open_spiel::file::IsDirectory(std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x7f72): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x7f7c): undefined reference to `open_spiel::file::Exists(std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x808c): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x8096): undefined reference to `open_spiel::file::Exists(std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x84d4): undefined reference to `open_spiel::file::File::File(std::string const&, std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x8526): undefined reference to `open_spiel::json::ToString(std::map<std::string, open_spiel::json::Value, std::less<std::string>, std::allocator<std::pair<std::string const, open_spiel::json::Value> > > const&, bool, int)'
/usr/bin/ld: alpha_zero.cc:(.text+0x9bf9): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x9c1c): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x9c3f): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text+0x9ccf): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::json::Value::GetDouble()':
alpha_zero.cc:(.text._ZN10open_spiel4json5Value9GetDoubleEv[_ZN10open_spiel4json5Value9GetDoubleEv]+0x6a): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero.cc:(.text._ZN10open_spiel4json5Value9GetDoubleEv[_ZN10open_spiel4json5Value9GetDoubleEv]+0x72): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::json::Value::GetInt()':
alpha_zero.cc:(.text._ZN10open_spiel4json5Value6GetIntEv[_ZN10open_spiel4json5Value6GetIntEv]+0x6a): undefined reference to `absl::StrCat(absl::AlphaNum const&, absl::AlphaNum const&)'
/usr/bin/ld: alpha_zero.cc:(.text._ZN10open_spiel4json5Value6GetIntEv[_ZN10open_spiel4json5Value6GetIntEv]+0x72): undefined reference to `open_spiel::SpielFatalError(std::string const&)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::FileLogger::FileLogger(std::string const&, std::string const&, std::string const&)':
alpha_zero.cc:(.text._ZN10open_spiel10FileLoggerC2ERKSsS2_S2_[_ZN10open_spiel10FileLoggerC2ERKSsS2_S2_]+0x2c): undefined reference to `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::string>(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)'
/usr/bin/ld: alpha_zero.cc:(.text._ZN10open_spiel10FileLoggerC2ERKSsS2_S2_[_ZN10open_spiel10FileLoggerC2ERKSsS2_S2_]+0x5c): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: alpha_zero.cc:(.text._ZN10open_spiel10FileLoggerC2ERKSsS2_S2_[_ZN10open_spiel10FileLoggerC2ERKSsS2_S2_]+0x70): undefined reference to `open_spiel::file::File::File(std::string const&, std::string const&)'
/usr/bin/ld: alpha_zero.cc:(.text._ZN10open_spiel10FileLoggerC2ERKSsS2_S2_[_ZN10open_spiel10FileLoggerC2ERKSsS2_S2_]+0xb6): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `void open_spiel::Logger::Print<int, double, double, int, unsigned long>(absl::str_format_internal::FormatSpecTemplate<str_format_internal::ArgumentToConv<int>(), str_format_internal::ArgumentToConv<double>(), str_format_internal::ArgumentToConv<double>(), str_format_internal::ArgumentToConv<int>(), str_format_internal::ArgumentToConv<unsigned long>()> const&, int const&, double const&, double const&, int const&, unsigned long const&)':
alpha_zero.cc:(.text._ZN10open_spiel6Logger5PrintIiJddimEEEvRKN4absl19str_format_internal18FormatSpecTemplateIJXclsr19str_format_internalE14ArgumentToConvIT_EEEXspclsr19str_format_internalE14ArgumentToConvIT0_EEEEEERKS5_DpRKS6_[_ZN10open_spiel6Logger5PrintIiJddimEEEvRKN4absl19str_format_internal18FormatSpecTemplateIJXclsr19str_format_internalE14ArgumentToConvIT_EEEXspclsr19str_format_internalE14ArgumentToConvIT0_EEEEEERKS5_DpRKS6_]+0x83): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::FileLogger::Print(std::string const&)':
alpha_zero.cc:(.text._ZN10open_spiel10FileLogger5PrintERKSs[_ZN10open_spiel10FileLogger5PrintERKSs]+0x33): undefined reference to `absl::FormatTime(std::basic_string_view<char, std::char_traits<char> >, absl::Time, absl::TimeZone)'
/usr/bin/ld: alpha_zero.cc:(.text._ZN10open_spiel10FileLogger5PrintERKSs[_ZN10open_spiel10FileLogger5PrintERKSs]+0x3f): undefined reference to `bool absl::str_format_internal::FormatArgImpl::Dispatch<std::string>(absl::str_format_internal::FormatArgImpl::Data, absl::str_format_internal::FormatConversionSpecImpl, void*)'
/usr/bin/ld: alpha_zero.cc:(.text._ZN10open_spiel10FileLogger5PrintERKSs[_ZN10open_spiel10FileLogger5PrintERKSs]+0x6d): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
/usr/bin/ld: ../algorithms/alpha_zero_torch/CMakeFiles/alpha_zero_torch.dir/alpha_zero.cc.o: in function `open_spiel::SerializableCircularBuffer<open_spiel::algorithms::torch_az::VPNetModel::TrainInputs>::LoadBuffer(std::string const&)':
alpha_zero.cc:(.text._ZN10open_spiel26SerializableCircularBufferINS_10algorithms8torch_az10VPNetModel11TrainInputsEE10LoadBufferERKSs[_ZN10open_spiel26SerializableCircularBufferINS_10algorithms8torch_az10VPNetModel11TrainInputsEE10LoadBufferERKSs]+0x19f): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, 
alpha_zero.cc:(.text._ZN10open_spiel26SerializableCircularBufferINS_10algorithms8torch_az10VPNetModel11TrainInputsEE10LoadBufferERKSs[_ZN10open_spiel26SerializableCircularBufferINS_10algorithms8torch_az10VPNetModel11TrainInputsEE10LoadBufferERKSs]+0x19f): undefined reference to `absl::str_format_internal::FormatPack(absl::str_format_internal::UntypedFormatSpecImpl, absl::Span<absl::str_format_internal::FormatArgImpl const>)'
...

And I think the problem might be related to linking with ABSL?
Please help me solving this problem, big thank you!

@lanctot
Copy link
Collaborator

lanctot commented Nov 21, 2022

Thanks for reporting.

It was also mentioned here, a few days back: #872 (comment)

Yeah, exactly.. my guess is the newest version of PyTorch uses a different abseil version than we download in our install script and the mismatch will cause naming/symbol problems.

This problem has come up several times before and it's always the same fix: simply match the abseil versions with the one used by the external library. It occurs because abseil is a compile-only library. So when different projects use different versions of it, the compiler gets confused because of the conflicting signatures (or missing functions) between versions.

Problem is I'm super overloaded in the next week.. so I might not get to it for a while. I think it will be as easy as just checking out the matching version or commit used by the PyTorch version in install.sh. So all we'd have to do is verify which one it is and change it in install.sh. However, I am slightly worried that it might conflict with OR-Tools (another optional dependency) which also requires a specific version -- that's the one OpenSpiel downloads :) Longer-term we'll have to build something in so we can pass the abseil version to the install script.

So I'd appreciate help anybody is willing to give to help fix this. Otherwise, I'll take a look once I'm a bit less busy.

@lanctot lanctot added the contribution welcome It's a nice feature! But we do not have the time to do it ourselves. Contribution welcomed! label Nov 21, 2022
@lanctot
Copy link
Collaborator

lanctot commented Nov 21, 2022

Hi @mcc311,

  • What is your operating system and version?
  • Can you confirm that you're not doing this within Docker ?

@lanctot
Copy link
Collaborator

lanctot commented Nov 21, 2022

Oh hold on a second... looking back, we updated our version of abseil on Jan 3rd of this year: ccd9ddc

And the thread you replied to seem to a few days back seemed to have a problem installing it in June. I wonder if it's been broken since then, actually (yikes!). Maybe we needed to upgrade the version of LibTorch we were downloading. I see that our global variables script downloads 1.5.1 here, which is quite old actually.

So I think it's probably as easy as upgrading to a version that was current on Jan 3rd, 2022. I found the previous versions here but no dates. Assuming they match the PyTorch versions, PyPI's release history is showing 1.10.1 was current in January. So my guess is changing the version of the LibTorch download URL (in global_variables.sh) will be the simple fix for this. Can you try it?

@lanctot
Copy link
Collaborator

lanctot commented Nov 21, 2022

Try changing the URL in the global_variables.sh to this URL:

https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-1.10.1%2Bcpu.zip

@mcc311
Copy link
Author

mcc311 commented Nov 22, 2022

hi @lanctot,
Thanks for replying me!

  • What is your operating system and version?
  • Can you confirm that you're not doing this within Docker ?

I use Ubuntu 22.04 LTS, and no, I didn't use Docker but only run on my local pc.

Try changing the URL in the global_variables.sh to this URL:

https://download.pytorch.org/libtorch/cpu/libtorch-cxx11-abi-shared-with-deps-1.10.1%2Bcpu.zip

And yes, I try to use older version of pytorch, the previous linking error don't show anymore. But it came a new redefinition problem with pybind11 like:
Full Version

...

/home/mcc311/open_spiel/open_spiel/../pybind11/include/pybind11/detail/common.h:634:8: note: previous definition is here
struct select_indices_impl {
       ^
In file included from /home/mcc311/open_spiel/open_spiel/python/pybind11/games_gin_rummy.cc:28:
In file included from /home/mcc311/open_spiel/open_spiel/python/../pybind11_abseil/pybind11_abseil/absl_casters.h:33:
In file included from /home/mcc311/open_spiel/open_spiel/libtorch/libtorch/include/pybind11/cast.h:13:
In file included from /home/mcc311/open_spiel/open_spiel/libtorch/libtorch/include/pybind11/pytypes.h:12:
/home/mcc311/open_spiel/open_spiel/libtorch/libtorch/include/pybind11/detail/common.h:505:65: error: redefinition of 'select_indices_impl<index_sequence<IPrev...>, I, B, Bs...>'
template <size_t... IPrev, size_t I, bool B, bool... Bs> struct select_indices_impl<index_sequence<IPrev...>, I, B, Bs...>
                                                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/mcc311/open_spiel/open_spiel/../pybind11/include/pybind11/detail/common.h:638:8: note: previous definition is here
struct select_indices_impl<index_sequence<IPrev...>, I, B, Bs...>
       ^
In file included from /home/mcc311/open_spiel/open_spiel/python/pybind11/games_gin_rummy.cc:28:
In file included from /home/mcc311/open_spiel/open_spiel/python/../pybind11_abseil/pybind11_abseil/absl_casters.h:33:
In file included from /home/mcc311/open_spiel/open_spiel/libtorch/libtorch/include/pybind11/cast.h:13:
In file included from /home/mcc311/open_spiel/open_spiel/libtorch/libtorch/include/pybind11/pytypes.h:12:
/home/mcc311/open_spiel/open_spiel/libtorch/libtorch/include/pybind11/detail/common.h:511:30: error: redefinition of 'negation'
template <typename T> struct negation : bool_constant<!T::value> { };
                             ^

...

I guess these pybind11s in both open_spiel/libtorch/libtorch/include/pybind11 and open_spiel/python/pybind11/ might conflict with each other, so I renamed the folder under libtorch to open_spiel/libtorch/libtorch/include/pybind11_ (uninclude it), and it can build and pass all the tests now.

I don't think it's a good way with stability, but it can work currently. Hope this imformation would help.

@lanctot
Copy link
Collaborator

lanctot commented Nov 22, 2022

Wow, that's too bad, but I'm glad it works now. I'll refer back to your solution in the docs until we can fix this properly, so let's keep this issue open for now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
contribution welcome It's a nice feature! But we do not have the time to do it ourselves. Contribution welcomed! help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

2 participants