How to install and add google re2 to a c++ application

429 Views Asked by At

Background

I'm trying to use Google re2 in my c++ application to evaluate regex.
I've done these to install abseil first, and then re2:

abseil

cd ~/Desktop
git clone https://github.com/abseil/abseil-cpp.git
cd abseil-cpp
mkdir build && cd build
cmake ..
make
make install

re2

cd ~/Desktop
git clone https://code.googlesource.com/re2
cd re2
make
make install

now in my simple application, I have this;

main.cpp

#include <iostream>
#include <re2/re2.h>

int main()
{
std::cout << re2::RE2::FullMatch("hello", "h.*o") << std::endl;

return 0;
}

Compiling

I've tried all of the followings, one by one:

g++ main.cpp -lre2
g++ main.cpp -lre2 -labsl

Even this (name of every file under /usr/local/lib/absl/):

g++ main.cpp -lre2 -labsl_atomic_hook_test_helper -labsl_bad_any_cast_impl -labsl_bad_optional_access -labsl_bad_variant_access -labsl_base -labsl_city -labsl_civil_time -labsl_cord -labsl_cord_internal -labsl_cordz_functions -labsl_cordz_handle -labsl_cordz_info -labsl_cordz_sample_token -labsl_crc32c -labsl_crc_cord_state -labsl_crc_cpu_detect -labsl_crc_internal -labsl_debugging_internal -labsl_demangle_internal -labsl_die_if_null -labsl_examine_stack -labsl_exception_safety_testing -labsl_exponential_biased -labsl_failure_signal_handler -labsl_flags -labsl_flags_commandlineflag -labsl_flags_commandlineflag_internal -labsl_flags_config -labsl_flags_internal -labsl_flags_marshalling -labsl_flags_parse -labsl_flags_private_handle_accessor -labsl_flags_program_name -labsl_flags_reflection -labsl_flags_usage -labsl_flags_usage_internal -labsl_graphcycles_internal -labsl_hash -labsl_hash_generator_testing -labsl_hashtablez_sampler -labsl_int128 -labsl_kernel_timeout_internal -labsl_leak_check -labsl_log_entry -labsl_log_flags -labsl_log_globals -labsl_log_initialize -labsl_log_internal_check_op -labsl_log_internal_conditions -labsl_log_internal_fnmatch -labsl_log_internal_format -labsl_log_internal_globals -labsl_log_internal_log_sink_set -labsl_log_internal_message -labsl_log_internal_nullguard -labsl_log_internal_proto -labsl_log_internal_test_actions -labsl_log_internal_test_helpers -labsl_log_internal_test_matchers -labsl_log_severity -labsl_log_sink -labsl_low_level_hash -labsl_malloc_internal -labsl_periodic_sampler -labsl_per_thread_sem_test_common -labsl_pow10_helper -labsl_random_distributions -labsl_random_internal_distribution_test_util -labsl_random_internal_platform -labsl_random_internal_pool_urbg -labsl_random_internal_randen -labsl_random_internal_randen_hwaes -labsl_random_internal_randen_hwaes_impl -labsl_random_internal_randen_slow -labsl_random_internal_seed_material -labsl_random_seed_gen_exception -labsl_random_seed_sequences -labsl_raw_hash_set -labsl_raw_logging_internal -labsl_scoped_mock_log -labsl_scoped_set_env -labsl_spinlock_test_common -labsl_spinlock_wait -labsl_stack_consumption -labsl_stacktrace -labsl_status -labsl_statusor -labsl_strerror -labsl_str_format_internal -labsl_strings -labsl_strings_internal -labsl_string_view -labsl_symbolize -labsl_synchronization -labsl_test_instance_tracker -labsl_throw_delegate -labsl_time -labsl_time_internal_test_util -labsl_time_zone

I've also tried to figure out how to use abslConfig.cmake for this matter using a CMakeList.txt like below:

cmake_minimum_required(VERSION 3.24)
project(interface)

set(CMAKE_CXX_STANDARD 20)

add_executable(interface main.cpp)

list(APPEND CMAKE_PREFIX_PATH "/usr/local/lib/cmake/absl/")
list(APPEND CMAKE_PREFIX_PATH "/usr/local/lib/cmake/re2/")

add_subdirectory("abseil-cpp")

find_package(absl REQUIRED)

set(re2_ABSL_USED_TARGETS
    absl::atomic_hook_test_helper
    absl::bad_any_cast_impl
    absl::bad_optional_access
    absl::bad_variant_access
    absl::base
    absl::city
    absl::civil_time
    absl::cord
    absl::cord_internal
    absl::cordz_functions
    absl::cordz_handle
    absl::cordz_info
    absl::cordz_sample_token
    absl::crc32c
    absl::crc_cord_state
    absl::crc_cpu_detect
    absl::crc_internal
    absl::debugging_internal
    absl::demangle_internal
    absl::die_if_null
    absl::examine_stack
    absl::exception_safety_testing
    absl::exponential_biased
    absl::failure_signal_handler
    absl::flags
    absl::flags_commandlineflag
    absl::flags_commandlineflag_internal
    absl::flags_config
    absl::flags_internal
    absl::flags_marshalling
    absl::flags_parse
    absl::flags_private_handle_accessor
    absl::flags_program_name
    absl::flags_reflection
    absl::flags_usage
    absl::flags_usage_internal
    absl::graphcycles_internal
    absl::hash
    absl::hash_generator_testing
    absl::hashtablez_sampler
    absl::int128
    absl::kernel_timeout_internal
    absl::leak_check
    absl::log_entry
    absl::log_flags
    absl::log_globals
    absl::log_initialize
    absl::log_internal_check_op
    absl::log_internal_conditions
    absl::log_internal_fnmatch
    absl::log_internal_format
    absl::log_internal_globals
    absl::log_internal_log_sink_set
    absl::log_internal_message
    absl::log_internal_nullguard
    absl::log_internal_proto
    absl::log_internal_test_actions
    absl::log_internal_test_helpers
    absl::log_internal_test_matchers
    absl::log_severity
    absl::log_sink
    absl::low_level_hash
    absl::malloc_internal
    absl::periodic_sampler
    absl::per_thread_sem_test_common
    absl::pow10_helper
    absl::random_distributions
    absl::random_internal_distribution_test_util
    absl::random_internal_platform
    absl::random_internal_pool_urbg
    absl::random_internal_randen
    absl::random_internal_randen_hwaes
    absl::random_internal_randen_hwaes_impl
    absl::random_internal_randen_slow
    absl::random_internal_seed_material
    absl::random_seed_gen_exception
    absl::random_seed_sequences
    absl::raw_hash_set
    absl::raw_logging_internal
    absl::scoped_mock_log
    absl::scoped_set_env
    absl::spinlock_test_common
    absl::spinlock_wait
    absl::stack_consumption
    absl::stacktrace
    absl::status
    absl::statusor
    absl::strerror
    absl::str_format_internal
    absl::strings
    absl::strings_internal
    absl::string_view
    absl::symbolize
    absl::synchronization
    absl::test_instance_tracker
    absl::throw_delegate
    absl::time
    absl::time_internal_test_util
    absl::time_zone
)



target_link_libraries(interface PUBLIC ${re2_ABSL_USED_TARGETS} re2)


Question and the problem

None of the above worked and all of them return me this linker error:

/usr/bin/ld: /usr/local/lib/libre2.a(regexp.cc.o): warning: relocation against `_ZN4absl16raw_log_internal21internal_log_functionB5cxx11E' in read-only section `.text._ZN4absl18container_internal19AssertSameContainerEPKNS0_6ctrl_tES3_RKPKvS7_PKhS9_[_ZN4absl18container_internal19AssertSameContainerEPKNS0_6ctrl_tES3_RKPKvS7_PKhS9_]'
/usr/bin/ld: /usr/local/lib/libre2.a(re2.cc.o): in function `void absl::base_internal::CallOnceImpl<re2::RE2::Init(std::basic_string_view<char, std::char_traits<char> >, re2::RE2::Options const&)::{lambda()#1}>(std::atomic<unsigned int>*, absl::base_internal::SchedulingMode, re2::RE2::Init(std::basic_string_view<char, std::char_traits<char> >, re2::RE2::Options const&)::{lambda()#1}&&)':
re2.cc:(.text+0x5b92): undefined reference to `absl::raw_log_internal::RawLog(absl::LogSeverity, char const*, int, char const*, ...)'
/usr/bin/ld: re2.cc:(.text+0x5c89): undefined reference to `absl::base_internal::SpinLockWait(std::atomic<unsigned int>*, int, absl::base_internal::SpinLockWaitTransition const*, absl::base_internal::SchedulingMode)'
/usr/bin/ld: /usr/local/lib/libre2.a(re2.cc.o): in function `void absl::base_internal::CallOnceImpl<re2::RE2::ReverseProg() const::{lambda(re2::RE2 const*)#1}, re2::RE2 const*>(std::atomic<unsigned int>*, absl::base_internal::SchedulingMode, re2::RE2::ReverseProg() const::{lambda(re2::RE2 const*)#1}&&, re2::RE2 const*&&)':
re2.cc:(.text+0x5e48): undefined reference to `absl::raw_log_internal::RawLog(absl::LogSeverity, char const*, int, char const*, ...)'

...
#Several lines omitted due to StackOverFlow 30000 char per question limit!
...

/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/interface.dir/build.make:97: interface] Error 1
make[1]: *** [CMakeFiles/Makefile2:660: CMakeFiles/interface.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

Could anyone please guide me through installing Google re2 and compiling my application with it?

0

There are 0 best solutions below