如何将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、或需要多个项目共享同一本地版本的场景:
- 在项目附近构建并安装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
- 修改项目的
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源码版本、无需单独安装步骤的场景:
- 添加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
- 修改项目的
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
相关产品推荐
相关产品推荐

