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

Undefined reference to absl and utf8_range during linking #12271

Closed
rymarm opened this issue Mar 20, 2023 · 4 comments
Closed

Undefined reference to absl and utf8_range during linking #12271

rymarm opened this issue Mar 20, 2023 · 4 comments

Comments

@rymarm
Copy link

rymarm commented Mar 20, 2023

I build a shared library with link to static protobuf, but when I try to link to it from target, it fails with undefined undefined reference to absl::lts_20230125.... Is there some new prerequisites to build projects with protobuf 3.22.0+? Do I have to link my projects to abseil or no now?

src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, absl::lts_20230125::string_view, absl::lts_20230125::string_view const*, unsigned long)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::str_format_internal::AppendPack(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, absl::lts_20230125::str_format_internal::UntypedFormatSpecImpl, absl::lts_20230125::Span<absl::lts_20230125::str_format_internal::FormatArgImpl const>)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::container_internal::DropDeletesWithoutResize(absl::lts_20230125::container_internal::CommonFields&, absl::lts_20230125::container_internal::PolicyFunctions const&, void*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage::LogMessage(char const*, int, absl::lts_20230125::LogSeverity)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Mutex::AssertHeld() const'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::kCharNull'
src/clientlib/libdrillClient.so: undefined reference to `AbslInternalSpinLockWake_lts_20230125'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage::operator<<(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage::OstreamView::stream()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::RemoveSuffix(unsigned long)'
src/clientlib/libdrillClient.so: undefined reference to `bool absl::lts_20230125::str_format_internal::FormatArgImpl::Dispatch<long>(absl::lts_20230125::str_format_internal::FormatArgImpl::Data, absl::lts_20230125::str_format_internal::FormatConversionSpecImpl, void*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage& absl::lts_20230125::log_internal::LogMessage::operator<< <void*, 0>(void* const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage::OstreamView::OstreamView(absl::lts_20230125::log_internal::LogMessage::LogMessageData&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Mutex::ReaderUnlock()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::numbers_internal::FastIntToBuffer(int, char*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::base_internal::ThrowStdOutOfRange(char const*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::str_format_internal::FormatPack[abi:cxx11](absl::lts_20230125::str_format_internal::UntypedFormatSpecImpl, absl::lts_20230125::Span<absl::lts_20230125::str_format_internal::FormatArgImpl const>)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::container_internal::ClearBackingArray(absl::lts_20230125::container_internal::CommonFields&, absl::lts_20230125::container_internal::PolicyFunctions const&, bool)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage::OstreamView::~OstreamView()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage::operator<<(absl::lts_20230125::string_view)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::ByString::Find(absl::lts_20230125::string_view, unsigned long) const'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::StrAppend(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, absl::lts_20230125::AlphaNum const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::StrCat[abi:cxx11](absl::lts_20230125::AlphaNum const&, absl::lts_20230125::AlphaNum const&, absl::lts_20230125::AlphaNum const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::CheckOpMessageBuilder::NewString[abi:cxx11]()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::InlineRep::AppendTree(absl::lts_20230125::cord_internal::CordRep*, absl::lts_20230125::cord_internal::CordzUpdateTracker::MethodIdentifier)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::InlineRep::UnrefTree()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::ascii_internal::kToLower'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage::~LogMessage()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::raw_log_internal::RawLog(absl::lts_20230125::LogSeverity, char const*, int, char const*, ...)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Utf8SafeCEscape[abi:cxx11](absl::lts_20230125::string_view)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage::CopyToEncodedBuffer(absl::lts_20230125::string_view, absl::lts_20230125::log_internal::LogMessage::StringType)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::container_internal::FindInfo absl::lts_20230125::container_internal::find_first_non_full<void>(absl::lts_20230125::container_internal::CommonFields const&, unsigned long)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::DestroyCordSlow()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::CEscape[abi:cxx11](absl::lts_20230125::string_view)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::GetFlatAux(absl::lts_20230125::cord_internal::CordRep*, absl::lts_20230125::string_view*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::raw_log_internal::internal_log_function[abi:cxx11]'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::from_chars(char const*, char const*, double&, absl::lts_20230125::chars_format)'
src/clientlib/libdrillClient.so: undefined reference to `bool absl::lts_20230125::str_format_internal::FormatArgImpl::Dispatch<char const*>(absl::lts_20230125::str_format_internal::FormatArgImpl::Data, absl::lts_20230125::str_format_internal::FormatConversionSpecImpl, void*)'
src/clientlib/libdrillClient.so: undefined reference to `utf8_range::IsStructurallyValid(absl::lts_20230125::string_view)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::numbers_internal::safe_strto32_base(absl::lts_20230125::string_view, int*, int)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::MakeCheckOpValueString(std::ostream&, unsigned char)'
src/clientlib/libdrillClient.so: undefined reference to `bool absl::lts_20230125::str_format_internal::FormatArgImpl::Dispatch<absl::lts_20230125::string_view>(absl::lts_20230125::str_format_internal::FormatArgImpl::Data, absl::lts_20230125::str_format_internal::FormatConversionSpecImpl, void*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::ascii_internal::kToUpper'
src/clientlib/libdrillClient.so: undefined reference to `bool absl::lts_20230125::str_format_internal::FormatArgImpl::Dispatch<float>(absl::lts_20230125::str_format_internal::FormatArgImpl::Data, absl::lts_20230125::str_format_internal::FormatConversionSpecImpl, void*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::AppendPrecise(absl::lts_20230125::string_view, absl::lts_20230125::cord_internal::CordzUpdateTracker::MethodIdentifier)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::str_format_internal::SnprintF(char*, unsigned long, absl::lts_20230125::str_format_internal::UntypedFormatSpecImpl, absl::lts_20230125::Span<absl::lts_20230125::str_format_internal::FormatArgImpl const>)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::Clear()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::hash_internal::MixingHashState::LowLevelHashImpl(unsigned char const*, unsigned long)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::ByString::ByString(absl::lts_20230125::string_view)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::numbers_internal::FastIntToBuffer(unsigned long, char*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::string_view::find(char, unsigned long) const'
src/clientlib/libdrillClient.so: undefined reference to `bool absl::lts_20230125::str_format_internal::FormatArgImpl::Dispatch<unsigned int>(absl::lts_20230125::str_format_internal::FormatArgImpl::Data, absl::lts_20230125::str_format_internal::FormatConversionSpecImpl, void*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::ChunkIterator::AdvanceAndReadBytes(unsigned long)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage& absl::lts_20230125::log_internal::LogMessage::operator<< <unsigned short, 0>(unsigned short const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::hash_internal::MixingHashState::CombineLargeContiguousImpl64(unsigned long, unsigned char const*, unsigned long)'
src/clientlib/libdrillClient.so: undefined reference to `bool absl::lts_20230125::str_format_internal::FormatArgImpl::Dispatch<int>(absl::lts_20230125::str_format_internal::FormatArgImpl::Data, absl::lts_20230125::str_format_internal::FormatConversionSpecImpl, void*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::container_internal::EraseMetaOnly(absl::lts_20230125::container_internal::CommonFields&, absl::lts_20230125::container_internal::ctrl_t*, unsigned long)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::Append(absl::lts_20230125::Cord const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::StrCat[abi:cxx11](absl::lts_20230125::AlphaNum const&, absl::lts_20230125::AlphaNum const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Mutex::Unlock()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::kUnsignedCharNull'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Mutex::Lock()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::CUnescape(absl::lts_20230125::string_view, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessageFatal::LogMessageFatal(char const*, int, absl::lts_20230125::string_view)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::GetAppendBufferSlowPath(unsigned long, unsigned long, unsigned long)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage& absl::lts_20230125::log_internal::LogMessage::operator<< <unsigned int, 0>(unsigned int const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::hash_internal::MixingHashState::kSeed'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessageFatal::LogMessageFatal(char const*, int)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::base_internal::SpinLockWait(std::atomic<unsigned int>*, int, absl::lts_20230125::base_internal::SpinLockWaitTransition const*, absl::lts_20230125::base_internal::SchedulingMode)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::InlineRep::AppendArray(absl::lts_20230125::string_view, absl::lts_20230125::cord_internal::CordzUpdateTracker::MethodIdentifier)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Mutex::ReaderLock()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::MakeCheckOpValueString(std::ostream&, void const*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::StrAppend(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, absl::lts_20230125::AlphaNum const&, absl::lts_20230125::AlphaNum const&, absl::lts_20230125::AlphaNum const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::AlphaNum::AlphaNum(absl::lts_20230125::Hex)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessageFatal::~LogMessageFatal()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage& absl::lts_20230125::log_internal::LogMessage::operator<< <unsigned long, 0>(unsigned long const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::AsciiStrToLower(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::container_internal::kEmptyGroup'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Mutex::~Mutex()'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::StrAppend(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, absl::lts_20230125::AlphaNum const&, absl::lts_20230125::AlphaNum const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::numbers_internal::FastIntToBuffer(unsigned int, char*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::CheckOpMessageBuilder::CheckOpMessageBuilder(char const*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::string_view::rfind(char, unsigned long) const'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::numbers_internal::FastIntToBuffer(long, char*)'
src/clientlib/libdrillClient.so: undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >* absl::lts_20230125::log_internal::MakeCheckOpString<absl::lts_20230125::string_view const&, absl::lts_20230125::string_view const&>(absl::lts_20230125::string_view const&, absl::lts_20230125::string_view const&, char const*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::Append(absl::lts_20230125::Cord&&)'
src/clientlib/libdrillClient.so: undefined reference to `bool absl::lts_20230125::str_format_internal::FormatArgImpl::Dispatch<double>(absl::lts_20230125::str_format_internal::FormatArgImpl::Data, absl::lts_20230125::str_format_internal::FormatConversionSpecImpl, void*)'
src/clientlib/libdrillClient.so: undefined reference to `bool absl::lts_20230125::str_format_internal::FormatArgImpl::Dispatch<unsigned long>(absl::lts_20230125::str_format_internal::FormatArgImpl::Data, absl::lts_20230125::str_format_internal::FormatConversionSpecImpl, void*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::Cord::operator=(absl::lts_20230125::string_view)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::ascii_internal::kPropertyBits'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::CheckOpMessageBuilder::ForVar2()'
src/clientlib/libdrillClient.so: undefined reference to `bool absl::lts_20230125::str_format_internal::FormatArgImpl::Dispatch<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >(absl::lts_20230125::str_format_internal::FormatArgImpl::Data, absl::lts_20230125::str_format_internal::FormatConversionSpecImpl, void*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::StrCat[abi:cxx11](absl::lts_20230125::AlphaNum const&, absl::lts_20230125::AlphaNum const&, absl::lts_20230125::AlphaNum const&, absl::lts_20230125::AlphaNum const&)'
src/clientlib/libdrillClient.so: undefined reference to `bool absl::lts_20230125::str_format_internal::FormatArgImpl::Dispatch<unsigned char>(absl::lts_20230125::str_format_internal::FormatArgImpl::Data, absl::lts_20230125::str_format_internal::FormatConversionSpecImpl, void*)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::log_internal::LogMessage& absl::lts_20230125::log_internal::LogMessage::operator<< <int, 0>(int const&)'
src/clientlib/libdrillClient.so: undefined reference to `absl::lts_20230125::strings_internal::CatPieces[abi:cxx11](std::initializer_list<absl::lts_20230125::string_view>)'

The issue occurs on protobuff 3.22.0+.

libdrillClient.so - a shared library that has link on static protobuf (cmake source)
querySubmitter - the target that has link on shared libdrillClient (cmake source)

Abseil build:

mkdir build && cd build
cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DABSL_PROPAGATE_CXX_STD=ON ..
cmake --build . --target install

Protobuf build:

mkdir build && cd build
cmake .. -Dprotobuf_ABSL_PROVIDER=package -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_POSITION_INDEPENDENT_CODE=ON
make install

Env:

OS: Ubuntu 18.04.6
Cmake: 3.26.0
GCC: 7.5.0
Protobuf: 3.22.2
Abseil: 20230125

@deannagarcia
Copy link
Member

Yes, protobuf now requires abseil as announced here. You need to install absl and set the -DCMAKE_PREFIX_PATH flag to where you have absl installed.

@rymarm
Copy link
Author

rymarm commented Mar 22, 2023

@deannagarcia Yes, I know and installed abseil before the protobuf build. Protobuf installs successfully, but problems come when I try to build an execution target with a link to a shared library that uses protobuf:

execution querySubmiter -> shared libdrillClient.so -> static libprotobuf.a

During querySubmiter linking to drillClient there are occurs undefined reference to errors, that I already mentioned above:

libdrillClient.so: undefined reference to `absl::lts_20230125::substitute_internal::SubstituteAndAppendArray(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*, absl::lts_20230125::string_view, absl::lts_20230125::string_view const*, unsigned long)'

...

libdrillClient.so: undefined reference to `utf8_range::IsStructurallyValid(absl::lts_20230125::string_view)'

...

All those errors are related with abseil and utf8_range (utf8_validity).
I'm not familiar with cmake and c++ build, so I'm not sure how actually works linking, but do I need to add links on abseil and ut8_range to my shared library that uses protobuf to make it work correctly?

I was able to solve errors when linked drillClient to abseil and utf8_range in the following way:

add_library(drillClient SHARED ${CLIENTLIB_SRC_FILES})

...

find_package(utf8_range REQUIRED)
find_package(absl REQUIRED)

 set(protobuf_ABSL_USED_TARGETS
    absl::absl_check
    absl::absl_log
    absl::algorithm
    absl::base
    absl::bind_front
    absl::bits
    absl::btree
    absl::cleanup
    absl::cord
    absl::core_headers
    absl::debugging
    absl::die_if_null
    absl::dynamic_annotations
    absl::flags
    absl::flat_hash_map
    absl::flat_hash_set
    absl::function_ref
    absl::hash
    absl::layout
    absl::log_initialize
    absl::log_severity
    absl::memory
    absl::node_hash_map
    absl::node_hash_set
    absl::optional
    absl::span
    absl::status
    absl::statusor
    absl::strings
    absl::synchronization
    absl::time
    absl::type_traits
    absl::utility
    absl::variant
  )

target_link_libraries(drillClient ${PROTOBUF_LIBRARY} protomsgs ${protobuf_ABSL_USED_TARGETS} utf8_range::utf8_validity)

But it doesn't look like it is a right way of how it should be fixed.
Could you, please, explain, are utf8_range and abseil required to be linked to now in a shared library that uses rpotobuf?

@rymarm rymarm changed the title Undefined reference to absl during linking Undefined reference to absl and utf8_range during linking Mar 22, 2023
@deannagarcia
Copy link
Member

Yes, if you use a shared library that uses protobuf you will need to provide an abseil dependency. Your solution of packaging the shared library with abseil would fix it, but if you want to keep the library without any statically linked dependencies you will need to add the -DCMAKE_PREFIX_PATH flag to your cmake build as mentioned earlier with the path to where you installed abseil.

@daniel0076
Copy link

For anyone who comes later, here is a related thread that elegantly solve the issue: #12292

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants