这是一个谷歌开源的cpp库, 包括了一些容器,字符串工具等。

Quickstart: https://abseil.io/docs/cpp/quickstart-cmake.html

Github: https://github.com/abseil/abseil-cpp

这个库大概主要包括下面几个内容。

  • 基础库 base
  • 算法库 algorithm
  • 容器库 container
  • 哈希库 hash
  • 字符串库 strings
  • 工具库 utility
  • 等等

笔者的使用记录

编译和链接

笔者刚开始是把 abseil当做一个子项目 放在自己的项目里面的, 并使用cmake添加它们。

这样使用的时候, 笔者发现了一个问题,那就是会增加很多个cmake的 target, 编译起来的输出令笔者感觉到不适,而且编译速度应该是有所降低。 所以笔者就改用了 Homebrew进行安装。

使用brew install abseil命令进行安装,之后在自己的cmake项目文件里面这样添加即可。

# abseil
find_package(absl REQUIRED)
target_link_libraries(
        sight-util PUBLIC
        absl::base
        absl::strings
        absl::hash
        absl::flat_hash_map
        absl::flat_hash_set
        absl::btree
)

使用brew安装之后, 可能还是有个问题,那就是可能会出现链接或者编译错误, 如果出现了这个错误, 把自己的项目也改成c++17版本就可以了。

# specify the C++ standard
set(CMAKE_CXX_STANDARD 17)

或者, 可以考虑把 abseil的版本切换成自己使用的cpp版本。

这个方法笔者没有切身实际的去操作过, 所以仅仅提供一些思路。

使用

在使用的时候, 笔者发现 abseil的cmake target 很乱, 基本上没有太多规则。 如果没有指示的话, 可能很难找到正确的target name。

不过好在, 笔者后来发现了这个文件CMake/AbseilDll.cmake 这个文件里面记录了所有的target, 如果需要什么,只需要在这个文件里面搜索一下即可。

这里附上 当前的所有target.

set(ABSL_INTERNAL_DLL_TARGETS
  "stacktrace"
  "symbolize"
  "examine_stack"
  "failure_signal_handler"
  "debugging_internal"
  "demangle_internal"
  "leak_check"
  "leak_check_disable"
  "stack_consumption"
  "debugging"
  "hash"
  "spy_hash_state"
  "city"
  "memory"
  "strings"
  "strings_internal"
  "cord"
  "str_format"
  "str_format_internal"
  "pow10_helper"
  "int128"
  "numeric"
  "utility"
  "any"
  "bad_any_cast"
  "bad_any_cast_impl"
  "span"
  "optional"
  "bad_optional_access"
  "bad_variant_access"
  "variant"
  "compare"
  "algorithm"
  "algorithm_container"
  "graphcycles_internal"
  "kernel_timeout_internal"
  "synchronization"
  "thread_pool"
  "bind_front"
  "function_ref"
  "atomic_hook"
  "log_severity"
  "raw_logging_internal"
  "spinlock_wait"
  "config"
  "dynamic_annotations"
  "core_headers"
  "malloc_internal"
  "base_internal"
  "base"
  "throw_delegate"
  "pretty_function"
  "endian"
  "bits"
  "exponential_biased"
  "periodic_sampler"
  "scoped_set_env"
  "type_traits"
  "meta"
  "random_random"
  "random_bit_gen_ref"
  "random_distributions"
  "random_seed_gen_exception"
  "random_seed_sequences"
  "random_internal_traits"
  "random_internal_distribution_caller"
  "random_internal_distributions"
  "random_internal_fast_uniform_bits"
  "random_internal_seed_material"
  "random_internal_pool_urbg"
  "random_internal_explicit_seed_seq"
  "random_internal_sequence_urbg"
  "random_internal_salted_seed_seq"
  "random_internal_iostream_state_saver"
  "random_internal_generate_real"
  "random_internal_wide_multiply"
  "random_internal_fastmath"
  "random_internal_nonsecure_base"
  "random_internal_pcg_engine"
  "random_internal_randen_engine"
  "random_internal_platform"
  "random_internal_randen"
  "random_internal_randen_slow"
  "random_internal_randen_hwaes"
  "random_internal_randen_hwaes_impl"
  "random_internal_uniform_helper"
  "status"
  "time"
  "civil_time"
  "time_zone"
  "container"
  "btree"
  "compressed_tuple"
  "fixed_array"
  "inlined_vector_internal"
  "inlined_vector"
  "counting_allocator"
  "flat_hash_map"
  "flat_hash_set"
  "node_hash_map"
  "node_hash_set"
  "container_memory"
  "hash_function_defaults"
  "hash_policy_traits"
  "hashtablez_sampler"
  "hashtable_debug"
  "hashtable_debug_hooks"
  "have_sse"
  "node_hash_policy"
  "raw_hash_map"
  "container_common"
  "raw_hash_set"
  "layout"
  "tracked"
)

在使用的时候别忘记添加absl::前缀。