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?