注意
本文最后更新于 2023-11-13,文中内容可能已过时。
这是一个谷歌开源的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项目文件里面这样添加即可。
1
2
3
4
5
6
7
8
9
10
11
|
# 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版本就可以了。
1
2
|
# specify the C++ standard
set(CMAKE_CXX_STANDARD 17)
|
或者, 可以考虑把 abseil的版本切换成自己使用的cpp版本。
这个方法笔者没有切身实际的去操作过, 所以仅仅提供一些思路。
使用
在使用的时候, 笔者发现 abseil的cmake target 很乱, 基本上没有太多规则。 如果没有指示的话, 可能很难找到正确的target name。
不过好在, 笔者后来发现了这个文件CMake/AbseilDll.cmake
这个文件里面记录了所有的target, 如果需要什么,只需要在这个文件里面搜索一下即可。
这里附上 当前的所有target.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
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::
前缀。