You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Abseil旁置安装并在CMake项目中关联使用?

如何在C++项目附近部署Abseil并通过CMake链接

背景与现有方案问题

Abseil官方文档介绍过克隆Git仓库并构建库的方法,也提到用add_subdirectory命令在CMakeLists.txt中添加依赖,但这种方式要求abseil-cpp必须是当前CMakeLists.txt所在目录的子目录。

当前项目的CMakeLists.txt大致内容如下:

cmake_minimum_required(VERSION 3.15)

project(my-project)

...

add_subdirectory(abseil-cpp)
add_subdirectory(location-where-my-executable-is)

其他可选方案存在明显不足:

  • 全局安装Abseil:需要自行维护版本更新,还要注意避免被系统包管理器(如apt)意外覆盖。补充说明:CMake构建的Abseil在Linux系统默认安装路径为/usr/local,不会与apt等包管理器冲突,但多版本全局安装会引发版本区分问题。
  • 通过apt安装:提供的Abseil版本滞后于官方最新版,且更新频率低。

需求与优势

希望将Abseil部署在项目附近,让CMakeLists.txt能正确找到头文件目录并链接对应库,这种方式的优势包括:

  • 每个C++项目可独立链接不同版本或构建配置的Abseil
  • 不干扰系统包管理器,仍可通过其安装其他版本的Abseil
  • 便于快速更换项目所依赖的Abseil版本
  • 易于集成到Docker容器构建流程中

具体实现方案

方案1:本地安装+find_package指定路径

这种方式适合预编译Abseil、或需要多个项目共享同一本地版本的场景:

  1. 在项目附近构建并安装Abseil
    假设项目根目录为~/my-project,将Abseil安装到项目下的third_party/abseil-install目录:
mkdir -p ~/my-project/third_party/abseil-build
cd ~/my-project/third_party
git clone https://github.com/abseil/abseil-cpp.git
cd abseil-build
# 指定安装路径和C++标准
cmake ../abseil-cpp -DCMAKE_INSTALL_PREFIX=../abseil-install -DCMAKE_CXX_STANDARD=17
# 编译并安装
cmake --build . --target install
  1. 修改项目的CMakeLists.txt
    通过CMAKE_PREFIX_PATH指定本地安装路径,再用find_package查找Abseil:
cmake_minimum_required(VERSION 3.15)

project(my-project)

# 指定本地Abseil的安装路径
set(CMAKE_PREFIX_PATH "${PROJECT_SOURCE_DIR}/third_party/abseil-install")

# 查找所需的Abseil组件(按需调整组件列表)
find_package(absl REQUIRED COMPONENTS base log strings)

# 添加可执行文件所在子目录
add_subdirectory(location-where-my-executable-is)

在可执行文件所在子目录的CMakeLists.txt中,添加链接配置:

# 假设你的可执行目标名为my-executable
target_link_libraries(my-executable PRIVATE absl::base absl::log absl::strings)

方案2:Git子模块+add_subdirectory灵活路径

这种方式适合直接跟踪Abseil源码版本、无需单独安装步骤的场景:

  1. 添加Git子模块
    将Abseil作为项目的Git子模块,放在third_party目录下:
cd ~/my-project
git submodule add https://github.com/abseil/abseil-cpp.git third_party/abseil-cpp
git submodule update --init --recursive
  1. 修改项目的CMakeLists.txt
    直接指定Abseil子模块的相对路径,用add_subdirectory引入:
cmake_minimum_required(VERSION 3.15)

project(my-project)

# 引入third_party目录下的Abseil源码
add_subdirectory(third_party/abseil-cpp)

# 添加可执行文件所在子目录
add_subdirectory(location-where-my-executable-is)

同样在可执行文件的CMakeLists.txt中添加链接配置:

target_link_libraries(my-executable PRIVATE absl::base absl::log absl::strings)

方案对比

  • 方案1:构建速度更快,适合需要预编译库的场景,可在多个项目间共享同一本地安装版本。
  • 方案2:无需单独安装步骤,直接跟踪源码版本,便于同步Abseil的更新或切换分支版本。

内容的提问来源于stack exchange,提问作者user2138149

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:09:58