protobuf icon indicating copy to clipboard operation
protobuf copied to clipboard

undefined reference to `utf8_range::IsStructurallyValid(std::basic_string_view<char, std::char_traits<char> >)

Open ivanzz1001 opened this issue 1 year ago • 5 comments

I build brpc(https://github.com/apache/brpc) and meet the following when It link protobuf:

/root/cpp_proj/brpc-compile/protobuf/src/google/protobuf/generated_message_tctable_lite.cc:1419: undefined reference to `utf8_range::IsStructurallyValid(std::basic_string_view<char, std::char_traits<char> >)'
/usr/bin/ld: /root/cpp_proj/brpc-compile/protobuf/output-inst/lib/libprotobuf.a(generated_message_tctable_lite.cc.o): in function `google::protobuf::internal::TcParser::FastUS2(google::protobuf::MessageLite*, char const*, google::protobuf::internal::ParseContext*, google::protobuf::internal::TcFieldData, google::protobuf::internal::TcParseTableBase const*, unsigned long)':
/root/cpp_proj/brpc-compile/protobuf/src/google/protobuf/generated_message_tctable_lite.cc:1419: undefined reference to `utf8_range::IsStructurallyValid(std::basic_string_view<char, std::char_traits<char> >)'

My protobuf version is 'tags/v4.25.0' and I use the following command to build my protobuf:

# mkdir build output-inst && cd build && pwd
# cmake -G "Unix Makefiles"  -DCMAKE_CXX_STANDARD=17 -DABSL_PROPAGATE_CXX_STD=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -Dprotobuf_BUILD_TESTS=OFF -DCMAKE_INSTALL_PREFIX=/root/cpp_proj/brpc-compile/protobuf/output-inst ..

# make -j2
# make install

When I built out the 'libprotobuf.a', I checked my protobuf has already linked 'utf8_validity':

# pkg-config --libs-only-l protobuf
-lprotobuf -labsl_log_internal_check_op -labsl_leak_check -labsl_die_if_null -labsl_log_internal_conditions -labsl_log_internal_message -labsl_examine_stack -labsl_log_internal_format -labsl_log_internal_proto -labsl_log_internal_nullguard -labsl_log_internal_log_sink_set -labsl_log_sink -labsl_log_entry -labsl_flags_internal -labsl_flags_marshalling -labsl_flags_reflection -labsl_flags_private_handle_accessor -labsl_flags_commandlineflag -labsl_flags_commandlineflag_internal -labsl_flags_config -labsl_flags_program_name -labsl_log_initialize -labsl_log_globals -labsl_vlog_config_internal -labsl_log_internal_fnmatch -labsl_log_internal_globals -labsl_raw_hash_set -labsl_hash -labsl_city -labsl_low_level_hash -labsl_hashtablez_sampler -labsl_statusor -labsl_status -labsl_cord -labsl_cordz_info -labsl_cord_internal -labsl_cordz_functions -labsl_exponential_biased -labsl_cordz_handle -labsl_crc_cord_state -labsl_crc32c -labsl_crc_internal -labsl_crc_cpu_detect -labsl_bad_optional_access -labsl_strerror -labsl_str_format_internal -labsl_synchronization -labsl_graphcycles_internal -labsl_kernel_timeout_internal -labsl_stacktrace -labsl_symbolize -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_time -labsl_civil_time -labsl_time_zone -labsl_bad_variant_access -lutf8_validity -lutf8_range -labsl_strings -labsl_strings_internal -labsl_string_view -labsl_base -lrt -labsl_spinlock_wait -labsl_int128 -labsl_throw_delegate -labsl_raw_logging_internal -labsl_log_severity

But why It stills report: undefined reference to `utf8_range::IsStructurallyValid(std::basic_string_view<char, std::char_traits >)'

Can anyone help me ?

ivanzz1001 avatar Oct 27 '24 08:10 ivanzz1001

utf8_range::IsStructurallyValid(std::basic_string_view<char, std::char_traits >) is realized in libutf8_validity.a:

# strings libutf8_validity.a | grep IsStructurallyValid
B_ZN10utf8_range19IsStructurallyValidESt17basic_string_viewIcSt11char_traitsIcEE
IsStructurallyValid
_ZN10utf8_range19IsStructurallyValidESt17basic_string_viewIcSt11char_traitsIcEE
_ZN10utf8_range19IsStructurallyValidESt17basic_string_viewIcSt11char_traitsIcEE

ivanzz1001 avatar Oct 27 '24 08:10 ivanzz1001

I think this might be an issue with how Abseil is configured in your system. Both protobuf and utf8_range use absl::string_view in their APIs. Abseil itself has a configuration where you can make absl::string_view be an alias to std::string_view.

From the linker error I think the protobuf library is built with the aliasing on (which is why it is looking for IsStructurallyValid(std::string_view)), but the utf8_range library has it off.

You can see the Abseil option here https://abseil.io/docs/cpp/guides/options https://github.com/abseil/abseil-cpp/blob/fa588813c4b2d931737bbe7c4b4f7fa6ed7509db/absl/base/options.h#L127

By default Abseil will autodetect the presence of std::string_view and alias if it is there. However, this means that if you try to mix libraries built with different configs (eg one at C++14 and one at C++17) you might get conflicting answers. For those cases, you should manually specify -DABSL_OPTION_USE_STD_STRING_VIEW=0 on all builds to make sure they all agree.

sbenzaquen avatar Oct 30 '24 15:10 sbenzaquen

I'm compiling the apache/brpc library and encounter the same issue. I tried manually specify -DABSL_OPTION_USE_STD_STRING_VIEW=0 but failed. But then I manually add -lutf8_validity the problem solved.

litao3rd avatar Dec 30 '24 05:12 litao3rd

image You are missing to link utf8_range::utf8_validity

adjfangjiawei avatar Jan 05 '25 06:01 adjfangjiawei

We triage inactive PRs and issues in order to make it easier to find active work. If this issue should remain active or becomes active again, please add a comment.

This issue is labeled inactive because the last activity was over 90 days ago. This issue will be closed and archived after 14 additional days without activity.

github-actions[bot] avatar Apr 05 '25 10:04 github-actions[bot]

We triage inactive PRs and issues in order to make it easier to find active work. If this issue should remain active or becomes active again, please reopen it.

This issue was closed and archived because there has been no new activity in the 14 days since the inactive label was added.

github-actions[bot] avatar Apr 19 '25 10:04 github-actions[bot]