Ubuntu22.04中使用cmake安装abseil-cpp库

关于Abseil库

Abseil 由 Google 的基础 C ++ 和 Python 代码库组成,包括一些正支撑着如 gRPC、Protobuf 和 TensorFlow 等开源项目并一起 “成长” 的库。目前已开源 C++ 部分,Python 部分将在后续开放。

Abseil 是一个开源的 C++ 库代码集合,旨在增强 C++ 标准库的功能。Abseil 库代码源自 Google 自己的 C++ 代码库,经过了广泛的测试和生产环境使用,与我们日常编程工作中所依赖的代码完全相同。

在某些情况下,Abseil 提供了 C++ 标准中缺失的部分;在其他情况下,Abseil 针对我们在 Google 代码库中使用过程中发现的特殊需求,提供了标准的替代方案。我们会在提供给您的库代码中明确标注这些情况。

Abseil 并非旨在与标准库竞争;我们只是发现其中许多实用程序在我们的代码库中发挥了作用,现在我们希望将这些资源提供给整个 C++ 社区。

Abseil的C++部分github代码库:https://github.com/abseil/abseil-cpp

快速入门

如果您只是想开始使用,请务必至少浏览一下 Abseil 快速入门。快速入门包含有关设置开发环境、下载 Abseil 代码、运行测试以及如何运行简单二进制文件的信息。

构建 Abseil

Bazel 和 CMake 是 Abseil 的官方构建系统。有关使用 Bazel 构建系统构建 Abseil 的更多信息,请参阅快速入门。如果您需要 CMake 支持,请查看 CMake 构建说明和 CMake 快速入门。

代码概览

Abseil包含以下c++库组件:

  • base
    基础库包含初始代码和其他Abseil代码所依赖的代码。 base中的代码可能不依赖于任何其他代码(c++标准库除外)。

  • algorithm
    算法库包含对c++ 库和基于容器的算法的补充。

  • cleanup
    清理库包含类似控制流构造的类型absl:: cleanup,用于在范围退出时执行回调。

  • container
    容器库包含额外的stl风格的容器,包括Abseil的无序“Swiss table”容器。

  • debugging
    调试库包含用于启用泄漏检查、堆栈跟踪和符号化的实用代码。

  • flags
    flags库包含处理Abseil构建的库和二进制程序的命令行标志的代码。

  • hash
    哈希库包含了Abseil中哈希类型的哈希框架和默认哈希函数实现。

  • iterator
    迭代器库包含用于在基于范围的for循环中增加范围的实用程序。

  • log
    日志库包含log和CHECK宏以及将日志消息写到磁盘、stderr或用户可扩展的目的地的工具。

  • memory
    内存库包含对c++的库进行扩充的内存管理工具。

  • meta
    元库包含在c++ <type_traits>库的c++ 14和c++ 17版本中可用的类型检查的兼容版本。

  • numeric
    数值库包含128位整数类型以及c++ 20的逐位数学函数的实现。

  • profiling
    分析库包含用于分析c++实体的工具代码。 它目前是其他Abseil库的私有依赖项。

  • random
    随机库包含用于生成伪随机值的函数。

  • status
    状态库包含错误处理的抽象,特别是absl:: status和absl::StatusOr。

  • strings
    字符串库包含各种字符的常规用法和实用工具,包括c++ 17 std::string_view类型的c++ 14兼容版本。

  • synchronization
    同步库包含并发原语(Abseil的absl::Mutex类是std:: Mutex的替代方案)和各种同步抽象。

  • time
    时间库包含用于计算绝对时间点、时间持续时间以及在时区内格式化和解析时间的抽象。

  • types
    类型库包含非容器实用程序类型,比如c++ 17 std::可选类型的c++ 14兼容版本。

  • utility
    工具库包含实用工具和辅助程序代码。

发布

Abseil 建议用户“实时更新”(尽可能频繁地从主分支更新到最新提交)。然而,我们意识到这种理念并非适用于所有项目,因此我们也提供长期支持版本,用于将严重错误修复反向移植到这些版本中。更多详情,请参阅我们的发布管理文档。

许可证

Abseil C++ 库遵循 Apache 许可证条款。更多信息请参阅许可证。

链接

更多关于 Abseil 的信息:

  • 查阅我们的 Abseil 简介
  • 阅读为什么采用 Abseil了解我们的设计理念。
  • 仔细阅读我们的 Abseil 兼容性保证,了解我们对您的承诺以及我们对您的期望。

Ubuntu22.04中使用cmake安装abseil-cpp库

我们可以使用bazel或者cmake这两个构建工具编译absel-cpp,具体取决于我们项目中采用哪种构建工具,是bazel还是cmake。
由于我习惯了使用cmake,所以实际项目中我常采用cmake作为编译工具。

  • C++ Quickstart With CMake
  • C++ Quickstart With Bazel
    参考 C++ Quickstart With CMake可以顺利在Ubuntu22.04中编译安装abseil-cpp库,默认生成的是abseil的.a静态库,如下图所示:
    abseil静态库
    其对应的编译命令为:
$ cd abseil-cpp
$ mkdir build && cd build
$ cmake -DABSL_BUILD_TESTING=ON -DABSL_USE_GOOGLETEST_HEAD=ON -DCMAKE_CXX_STANDARD=17 ..
...
-- Configuring done
-- Generating done
-- Build files have been written to: ${PWD}

通过查看对应的https://github.com/abseil/abseil-cpp/blob/master/CMakeLists.txt文件,搜索shared关键字,可以看出默认编译的是静态库,如下图所示:
CMakeLists.txt
所以为了生成abseil-cpp的动态库就很明确了,直接在原有的编译命令cmake -DABSL_BUILD_TESTING=ON -DABSL_USE_GOOGLETEST_HEAD=ON -DCMAKE_CXX_STANDARD=17 ..基础上将BUILD_SHARED_LIBS标记设置为ON即可,对应的编译动态库的命令为:

cmake -DBUILD_SHARED_LIBS=ON -DABSL_BUILD_TESTING=ON -DABSL_USE_GOOGLETEST_HEAD=ON -DCMAKE_CXX_STANDARD=17 ..

编译动态库
2.编译动态库
3.编译动态库
然后在执行sudo make install将库安装到默认安装目录/usr/local下,当然也可以使用CMAKE_INSTALL_PREFIX参数指定自己的安装目录。
安装.so动态库到/usr/local目录
1.abseil库的so
2.abseil库的so
这样我们就可以使用abseil库进行C++项目开发了,Google鼎鼎大名的protobuf库最新版本32.0也使用到了Abseil 库。

abseil-hello 示例程序

关于abseil-cpp库的使用示例,可以参见https://github.com/abseil/abseil-hello示例程序,
要了解如何将 Abseil 与 Bazel 构建系统结合使用,请参阅 bazel-hello。
bazel-hello

要了解如何将 Abseil 与 CMake 元构建系统结合使用,请参阅 cmake-hello。
cmake-hello

参考资料

  • https://abseil.io/
  • https://github.com/abseil/abseil-cpp
  • https://github.com/abseil/abseil-cpp/blob/master/CMakeLists.txt
  • https://abseil.io/docs/cpp/quickstart
  • https://abseil.io/docs/cpp/quickstart-cmake
  • https://github.com/abseil/abseil-hello
  • http://www.bazel.io/
  • https://cmake.org/
  • https://github.com/protocolbuffers/protobuf
  • Protocol Buffers - Google’s data interchange format

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95776.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95776.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95776.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FreeRTOS项目(序)目录

这章是整个专栏的目录&#xff0c;负责记录这个小项目的开发日志和目录。附带总流程图。 目录 项目简介 专栏目录 开发日志 总流程图 项目简介 本项目基于STM32C8T6核心板和FreeRTOS&#xff0c;实现一些简单的功能。以下为目前已实现的功能。 &#xff08;1&#xff09…

Python 多任务编程:进程、线程与协程全面解析

目录 一、多任务基础&#xff1a;并发与并行 1. 什么是多任务 2. 两种表现形式 二、进程&#xff1a;操作系统资源分配的最小单位 1. 进程的概念 2. 多进程实现多任务 2.1 基础示例&#xff1a;边听音乐边敲代码 2.2 带参数的进程任务 2.3 进程编号与应用注意点 2.3.…

ADSL技术

<摘要> ADSL&#xff08;非对称数字用户线路&#xff09;是一种利用传统电话线实现宽带上网的技术。其核心原理是频率分割&#xff1a;将一根电话线的频带划分为语音、上行数据&#xff08;慢&#xff09;和下行数据&#xff08;快&#xff09;三个独立频道&#xff0c;从…

信号衰减中的分贝到底是怎么回事

问题&#xff1a;在一个低通滤波中&#xff0c;经常会看到一个值-3dB&#xff08;-3分贝&#xff09;&#xff0c;到底是个什么含义&#xff1f; 今天我就来粗浅的讲解这个问题。 在低通滤波器中&#xff0c;我们说的 “截止频率”&#xff08;或叫 - 3dB 点&#xff09;&…

工具分享--IP与域名提取工具2.0

基于原版的基础上新增了一个功能点:IP-A段过滤&#xff0c;可以快速把内网192、170、10或者其它你想要过滤掉的IP-A段轻松去掉&#xff0c;提高你的干活效率&#xff01;&#xff01;&#xff01; 界面样式预览&#xff1a;<!DOCTYPE html> <html lang"zh-CN&quo…

如何通过日志先行原则保障数据持久化:Redis AOF 和 MySQL redo log 的对比

在分布式系统或数据库管理系统中&#xff0c;日志先行原则&#xff08;Write-Ahead Logging&#xff0c;WAL&#xff09; 是确保数据一致性、持久性和恢复能力的重要机制。通过 WAL&#xff0c;系统能够在发生故障时恢复数据&#xff0c;保证数据的可靠性。在这篇博客中&#x…

临床研究三千问——临床研究体系的3个维度(8)

在上周的文章中&#xff0c;我们共同探讨了1345-10战策的“临床研究的起点——如何提出一个犀利的临床与科学问题”。问题固然是灵魂&#xff0c;但若没有坚实的骨架与血肉&#xff0c;灵魂便无所依归。今天&#xff0c;我们将深入“1345-10战策”中的“3”&#xff0c;即支撑起…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年9月7日第172弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。(1)定位…

万字详解网络编程之socket

一&#xff0c;socket简介1.什么是socketsocket通常也称作"套接字"&#xff0c;⽤于描述IP地址和端⼝&#xff0c;是⼀个通信链的句柄&#xff0c;应用程序通常通过"套接字"向⽹络发出请求或者应答⽹络请求。⽹络通信就是两个进程间的通信&#xff0c;这两…

维度跃迁:当万物皆成电路,智能将从“拥有”变为“存在”

我们习以为常的电子世界&#xff0c;其本质是一个由电路构成的精密宇宙。而一场从二维到三维的终极变革&#xff0c;正在悄然酝酿&#xff0c;它将彻底颠覆我们创造和交互的方式。一、电子世界的本质&#xff1a;一切都是电路 在深入未来之前&#xff0c;我们首先要理解当下。电…

大语言模型预训练数据采集与清洗技术实践:从语料到知识库的全流程优化

大语言模型(LLM)的性能上限由 “数据质量 数据规模 数据多样性” 共同决定 —— 预训练阶段的海量语料决定模型的泛化能力与语言理解基础,而知识库数据则决定模型的知识准确性与领域专业性。当前 LLM 落地面临的核心痛点之一,便是 “数据脏、处理难、知识杂”:预训练语料…

模拟音频采集设备的制作

模拟音频程序与设备的制作 需要设备 esp32s3 pcm1808 pcm5102(非必须) 程序界面 程序代码 代码链接

Java Modbus通信实战(四):Modbus通信测试与故障排查

在工业现场&#xff0c;设备通信系统就像工厂的神经网络&#xff0c;连接着各种传感器、控制器和执行器。当你搭建好这套系统后&#xff0c;最关键的一步就是全面测试&#xff0c;确保每个环节都能正常工作。 就像汽车出厂前要经过严格的路试一样&#xff0c;Modbus RTU通信系统…

少儿编程C++快速教程之——1. 基础语法和输入输出

1. 欢迎来到C编程世界&#xff01; 1.1 什么是编程&#xff1f; 编程就像是给计算机写一份详细的"说明书"&#xff0c;告诉它该做什么、怎么做。C是一种强大的编程语言&#xff0c;可以用来创建游戏、应用程序和各种有趣的软件&#xff01; 1.2 第一个C程序&#xff…

arma::imat22

arma::imat22 是 Armadillo C 线性代数库中定义的一个固定大小的 2x2 有符号整数矩阵类型。它主要用于处理小型、维度在编译时已知的整数矩阵&#xff0c;因其在栈上分配内存&#xff0c;故通常比动态矩阵有更高的效率。 下面是一个汇总了 arma::imat22 主要特性的表格&#xf…

狗都能看懂的HunYuan3D 1.0详解

HunYuan3D 1.0 HunYuan3D 1.0是2024年9月发布的一篇论文。虽然站在现在的时间节点&#xff0c;HunYuan3D系列已经出到2.5了&#xff0c;但是1.0版本的改进思路&#xff0c;和它trick集成的做法&#xff0c;还是很值得学习的。由于文章用到了很多技术&#xff0c;由于篇幅有限&a…

踏脚迈入奇幻乐园

每天早上上班的路上都会经过一个小花园。它被夹在丁字路口的拐角&#xff0c;面积不大&#xff0c;匆匆而过的行人都不会注意到它。但如果顺着几个不起眼的入口走进去&#xff0c;里面却是别有洞天。清早的街道还没有车水马龙的喧哗&#xff0c;花园里静悄悄的。各式各样的花草…

内存越界引发线程函数调用堆栈回溯异常以及INT 3软中断实战分析案例分享

目录 1、问题说明 2、导出dump文件时只是遇到了INT 3软中断&#xff0c;并没有发生异常崩溃 3、函数中发生了栈内存越界&#xff0c;导致线程的栈回溯出异常&#xff0c;堆栈中只显示一行函数调用记录 3.1、处理Json数据时产生了异常 3.2、函数中发生栈内存越界&#xff0…

LeetCode 240: 搜索二维矩阵 II - 算法详解(秒懂系列

文章目录LeetCode 240: 搜索二维矩阵 II - 算法详解题目描述Java解决方案算法思路核心理念为什么选择右上角&#xff1f;可视化演示过程示例1&#xff1a;查找 target 5示例2&#xff1a;查找 target 20 (不存在)算法分析时间复杂度空间复杂度算法优势关键要点扩展思考LeetCo…

洛谷 B4071 [GESP202412 五级] 武器强化

思考难度低&#xff0c;但是代码难度相对较高的题&#xff0c;故做个记录。首先&#xff0c;题目说了要花费最少的钱&#xff0c;所以我们每次拿最便宜的材料给武器1思想&#xff1a;每次都拿最便宜的材料然后考虑一下这个思想是否正确&#xff0c;找一下反例&#xff0c;每次拿…