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靜態庫,如下圖所示:
其對應的編譯命令為:
$ 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
關鍵字,可以看出默認編譯的是靜態庫,如下圖所示:
所以為了生成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 ..
然后在執行sudo make install
將庫安裝到默認安裝目錄/usr/local
下,當然也可以使用CMAKE_INSTALL_PREFIX
參數指定自己的安裝目錄。
這樣我們就可以使用abseil
庫進行C++項目開發了,Google鼎鼎大名的protobuf庫最新版本32.0也使用到了Abseil 庫。
abseil-hello 示例程序
關于abseil-cpp庫的使用示例,可以參見https://github.com/abseil/abseil-hello示例程序,
要了解如何將 Abseil 與 Bazel 構建系統結合使用,請參閱 bazel-hello。
要了解如何將 Abseil 與 CMake 元構建系統結合使用,請參閱 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