Ubuntu 16.04 编译安装 CMake 3.25 完整教程 - 从源码构建到配置优化

前言

Ubuntu 16.04 LTS 是一个非常稳定的长期支持版本,但其官方软件源中的 CMake 版本较老(通常是 3.5.x)。对于需要新特性支持的项目(如 C++17/20、新版 Qt、现代 CMake 实践等),我们需要手动编译安装最新版本的 CMake。本文详细介绍如何在 Ubuntu 16.04 上从源码编译安装 CMake 3.25。

官方文档https://cmake.org/documentation/

下载地址https://cmake.org/download/

目标版本:CMake 3.25.x

一、为什么需要编译安装

1.1 Ubuntu 16.04 的 CMake 版本问题

# Ubuntu 16.04 官方源的 CMake 版本
$ apt-cache policy cmake
cmake:
  已安装:3.5.1-1ubuntu3
  候选版本:3.5.1-1ubuntu3

CMake 3.5 发布于 2016 年,缺少很多现代特性:

  • 缺少 C++17/20 支持 - 无法正确检测新标准
  • 缺少现代 CMake 实践 - 如 target_link_libraries 的改进
  • 缺少新模块 - 如 FetchContent 的完整功能
  • 缺少性能优化 - 新版本构建速度更快
  • 安全更新 - 旧版本可能存在安全漏洞

1.2 为什么选择 3.25 版本

CMake 3.25 是一个稳定版本,提供了:

  • 完整的 C++20 支持
  • 改进的预设(Presets)功能
  • 更好的 IDE 集成
  • 性能优化和 bug 修复
  • 广泛的第三方库兼容性

二、准备工作

2.1 系统要求

# 操作系统
Ubuntu 16.04 LTS (x86_64)

# 最低配置
- CPU: 双核
- 内存:2GB
- 磁盘空间:5GB 可用空间

# 推荐配置
- CPU: 四核或更多
- 内存:4GB 或更多
- 磁盘空间:10GB 可用空间

2.2 安装编译依赖

# 更新软件包列表
sudo apt-get update

# 安装基础编译工具
sudo apt-get install -y build-essential

# 安装 CMake 编译依赖
sudo apt-get install -y     libssl-dev     zlib1g-dev     libbz2-dev     liblzma-dev     libncurses5-dev     libncursesw5-dev     libreadline-dev     libsqlite3-dev     libgdbm-dev     libdb5.3-dev     libexpat1-dev     libcurl4-gnutls-dev     libffi-dev     libxml2-dev     libxslt1-dev

# 安装可选依赖(用于 GUI 和额外功能)
sudo apt-get install -y     qtbase5-dev     qttools5-dev     qttools5-dev-tools     libqt5opengl5-dev     libqt5webkit5-dev     libglu1-mesa-dev     freeglut3-dev     mesa-common-dev

# 安装版本控制工具
sudo apt-get install -y git wget curl

# 清理不需要的包
sudo apt-get autoremove -y
sudo apt-get autoclean

2.3 创建安装目录

# 创建源码目录
sudo mkdir -p /opt/cmake-src
sudo chown $USER:$USER /opt/cmake-src

# 创建安装目录
sudo mkdir -p /opt/cmake-3.25
sudo chown $USER:$USER /opt/cmake-3.25

# 创建工作目录
mkdir -p ~/cmake-build
cd ~/cmake-build

三、下载 CMake 源码

3.1 从官方网站下载(推荐)

# 进入工作目录
cd ~/cmake-build

# 下载 CMake 3.25.3 源码(最新 3.25 版本)
wget https://cmake.org/files/v3.25/cmake-3.25.3.tar.gz

# 或者使用镜像源(国内用户)
# wget https://mirror.tuna.tsinghua.edu.cn/github-release/cmake/cmake-3.25.3.tar.gz

# 验证下载完整性(可选)
wget https://cmake.org/files/v3.25/cmake-3.25.3.tar.gz.sha256
sha256sum -c cmake-3.25.3.tar.gz.sha256

# 解压源码
tar -xzf cmake-3.25.3.tar.gz
cd cmake-3.25.3

3.2 从 Git 仓库克隆(可选)

# 克隆官方仓库
git clone https://gitlab.kitware.com/cmake/cmake.git
cd cmake

# 切换到 3.25.3 标签
git checkout v3.25.3

# 或者使用 GitHub 镜像
git clone https://github.com/Kitware/CMake.git
cd CMake
git checkout v3.25.3

四、编译安装

4.1 配置编译选项

# 创建构建目录
mkdir -p build
cd build

# 运行 bootstrap 脚本配置
../bootstrap     --prefix=/opt/cmake-3.25     --parallel=$(nproc)     --no-system-libs     --no-system-curl     --no-system-expat     --no-system-zlib     --no-system-bzip2     --no-system-libarchive     --no-system-librhash     --no-system-libuv     

# 配置选项说明:
# --prefix          安装目录
# --parallel        并行编译,使用所有 CPU 核心
# --no-system-libs  使用源码自带的库,避免兼容性问题
# --enable-openssl  启用 OpenSSL 支持(用于 HTTPS)
# --qt-gui          编译 Qt 图形界面(cmake-gui)

4.2 开始编译

# 使用 make 编译(bootstrap 已生成 Makefile)
make -j$(nproc)

# 或者使用 ninja(如果安装了)
# cmake -G Ninja .. && ninja

# 编译时间参考:
# - 双核 CPU:约 15-20 分钟
# - 四核 CPU:约 8-12 分钟
# - 八核 CPU:约 5-8 分钟

4.3 安装

# 安装到指定目录
make install

# 验证安装
/opt/cmake-3.25/bin/cmake --version

# 预期输出:
# cmake version 3.25.3
# 
# CMake suite maintained and supported by Kitware (kitware.com/cmake).

五、配置系统路径

5.1 方法一:更新 alternatives(推荐)

# 注册新版本的 cmake
sudo update-alternatives --install /usr/bin/cmake cmake /opt/cmake-3.25/bin/cmake 100
sudo update-alternatives --install /usr/bin/ctest ctest /opt/cmake-3.25/bin/ctest 100
sudo update-alternatives --install /usr/bin/cpack cpack /opt/cmake-3.25/bin/cpack 100
sudo update-alternatives --install /usr/bin/ccmake ccmake /opt/cmake-3.25/bin/ccmake 100

# 如果有 cmake-gui
sudo update-alternatives --install /usr/bin/cmake-gui cmake-gui /opt/cmake-3.25/bin/cmake-gui 100

# 设置默认版本
sudo update-alternatives --config cmake

# 验证
cmake --version

5.2 方法二:创建符号链接

# 备份旧版本(如果有)
sudo mv /usr/bin/cmake /usr/bin/cmake.old 2>/dev/null
sudo mv /usr/bin/ctest /usr/bin/ctest.old 2>/dev/null
sudo mv /usr/bin/cpack /usr/bin/cpack.old 2>/dev/null
sudo mv /usr/bin/ccmake /usr/bin/ccmake.old 2>/dev/null

# 创建符号链接
sudo ln -s /opt/cmake-3.25/bin/cmake /usr/bin/cmake
sudo ln -s /opt/cmake-3.25/bin/ctest /usr/bin/ctest
sudo ln -s /opt/cmake-3.25/bin/cpack /usr/bin/cpack
sudo ln -s /opt/cmake-3.25/bin/ccmake /usr/bin/ccmake
sudo ln -s /opt/cmake-3.25/bin/cmake-gui /usr/bin/cmake-gui 2>/dev/null

# 验证
cmake --version

5.3 方法三:修改 PATH 环境变量

# 编辑 ~/.bashrc 或 ~/.profile
echo 'export PATH=/opt/cmake-3.25/bin:$PATH' >> ~/.bashrc

# 使配置生效
source ~/.bashrc

# 验证
which cmake
cmake --version

5.4 配置 man 手册页

# 创建 man 目录链接
sudo mkdir -p /usr/local/share/man/man1
sudo ln -s /opt/cmake-3.25/man/man1/* /usr/local/share/man/man1/

# 更新 man 数据库
sudo mandb

# 查看帮助
man cmake

六、验证安装

6.1 版本检查

# 检查版本
cmake --version

# 检查所有组件
cmake --version && ctest --version && cpack --version

# 检查 GUI(如果安装了)
cmake-gui --version

6.2 功能测试

# 创建测试项目
mkdir -p ~/cmake-test
cd ~/cmake-test

# 创建 CMakeLists.txt
cat > CMakeLists.txt << 'EOF'
cmake_minimum_required(VERSION 3.25)
project(TestProject VERSION 1.0.0 LANGUAGES CXX)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 创建可执行文件
add_executable(hello main.cpp)

# 打印配置信息
message(STATUS "CMake version: ${CMAKE_VERSION}")
message(STATUS "C++ compiler: ${CMAKE_CXX_COMPILER}")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
EOF

# 创建测试源码
cat > main.cpp << 'EOF'
#include 
#include 

int main() {
    std::cout << "Hello from CMake!" << std::endl;
#ifdef __cpp_lib_ranges
    std::cout << "C++20 ranges supported!" << std::endl;
#endif
    return 0;
}
EOF

# 构建项目
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .

# 运行测试
./hello

6.3 检查支持的生成器

# 列出生成器
cmake --help

# 查看支持的生成器
cmake -G

# 常用生成器:
# - "Unix Makefiles" (默认)
# - "Ninja" (更快)
# - "Eclipse CDT4 Generator"
# - "CodeBlocks - Unix Makefiles"

七、使用 Ninja 加速构建(可选)

7.1 安装 Ninja

# 从源码编译 Ninja(推荐最新版本)
cd ~
git clone https://github.com/ninja-build/ninja.git
cd ninja
git checkout v1.11.1

# 编译
./configure.py --bootstrap

# 安装
sudo cp ninja /usr/local/bin/
sudo cp -r misc/ninja.vim /usr/share/vim/vim*/syntax/ 2>/dev/null

# 验证
ninja --version

7.2 使用 Ninja 构建项目

# 使用 Ninja 生成器
cmake -G Ninja -B build -S .
cmake --build build

# 或者
cd build
cmake -G Ninja ..
ninja

八、常见问题

8.1 编译错误:C++ 编译器太老

# Ubuntu 16.04 默认 GCC 版本可能太老
# 需要安装新版 GCC

# 添加 toolchain PPA
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update

# 安装 GCC 9
sudo apt-get install -y gcc-9 g++-9

# 设置默认版本
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 90

# 验证
gcc --version
g++ --version

# 重新配置 CMake
cd ~/cmake-build/cmake-3.25.3/build
../bootstrap --prefix=/opt/cmake-3.25 --parallel=$(nproc)
make -j$(nproc)
sudo make install

8.2 链接错误:OpenSSL 版本不兼容

# Ubuntu 16.04 的 OpenSSL 版本较老
# 可以禁用 OpenSSL 或使用源码自带

# 重新配置,不使用系统 OpenSSL
cd ~/cmake-build/cmake-3.25.3/build
rm -rf *
../bootstrap     --prefix=/opt/cmake-3.25     --parallel=$(nproc)     --no-system-libs

make -j$(nproc)
sudo make install

8.3 内存不足导致编译失败

# 减少并行编译的任务数
cd ~/cmake-build/cmake-3.25.3/build
make -j2  # 只使用 2 个核心

# 或者增加 swap 空间
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 验证 swap
free -h

8.4 安装后 cmake 命令找不到

# 检查 PATH
echo $PATH

# 临时添加路径
export PATH=/opt/cmake-3.25/bin:$PATH

# 永久添加到 ~/.bashrc
echo 'export PATH=/opt/cmake-3.25/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 或者使用完整路径
/opt/cmake-3.25/bin/cmake --version

8.5 与旧版本冲突

# 检查是否有多个 cmake
which -a cmake

# 卸载旧版本(如果需要)
sudo apt-get remove --purge cmake

# 或者使用 update-alternatives 管理
sudo update-alternatives --config cmake

九、卸载方法

# 方法 1:删除安装目录
sudo rm -rf /opt/cmake-3.25

# 方法 2:移除符号链接
sudo rm /usr/bin/cmake
sudo rm /usr/bin/ctest
sudo rm /usr/bin/cpack
sudo rm /usr/bin/ccmake
sudo rm /usr/bin/cmake-gui

# 方法 3:移除 alternatives 配置
sudo update-alternatives --remove cmake /opt/cmake-3.25/bin/cmake
sudo update-alternatives --remove ctest /opt/cmake-3.25/bin/ctest
sudo update-alternatives --remove cpack /opt/cmake-3.25/bin/cpack
sudo update-alternatives --remove ccmake /opt/cmake-3.25/bin/ccmake

# 方法 4:清理 PATH
# 编辑 ~/.bashrc,删除相关行
sed -i '/cmake-3.25/d' ~/.bashrc
source ~/.bashrc

# 清理源码和构建目录
rm -rf ~/cmake-build

十、性能优化建议

10.1 使用 ccache 加速重复编译

# 安装 ccache
sudo apt-get install -y ccache

# 配置 ccache
export CC="/usr/lib/ccache/gcc"
export CXX="/usr/lib/ccache/g++"

# 添加到 ~/.bashrc
echo 'export CC="/usr/lib/ccache/gcc"' >> ~/.bashrc
echo 'export CXX="/usr/lib/ccache/g++"' >> ~/.bashrc
source ~/.bashrc

# 查看缓存状态
ccache -s

10.2 CMake 预设配置

# CMake 3.25 支持预设配置
# 创建 CMakePresets.json
cat > CMakePresets.json << 'EOF'
{
    "version": 3,
    "configurePresets": [
        {
            "name": "release",
            "displayName": "Release",
            "generator": "Ninja",
            "binaryDir": "${sourceDir}/build/release",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Release",
                "CMAKE_CXX_STANDARD": "20"
            }
        },
        {
            "name": "debug",
            "displayName": "Debug",
            "generator": "Ninja",
            "binaryDir": "${sourceDir}/build/debug",
            "cacheVariables": {
                "CMAKE_BUILD_TYPE": "Debug",
                "CMAKE_CXX_STANDARD": "20"
            }
        }
    ],
    "buildPresets": [
        {
            "name": "release-build",
            "configurePreset": "release"
        },
        {
            "name": "debug-build",
            "configurePreset": "debug"
        }
    ]
}
EOF

# 使用预设
cmake --preset=release
cmake --build --preset=release-build

总结

通过本文,你应该已经成功在 Ubuntu 16.04 上编译安装了 CMake 3.25。主要步骤包括:

  1. 准备环境 - 安装编译依赖和工具链
  2. 下载源码 - 从官网或 Git 获取源码
  3. 配置编译 - 使用 bootstrap 配置选项
  4. 编译安装 - make 编译并安装到指定目录
  5. 配置路径 - 设置 alternatives 或 PATH
  6. 验证测试 - 确保安装成功

升级后的 CMake 3.25 将为你带来:

  • ✅ 完整的 C++20 支持
  • ✅ 更快的构建速度
  • ✅ 更好的 IDE 集成
  • ✅ 现代 CMake 实践支持
  • ✅ 持续的安全更新

如果你在编译过程中遇到问题,可以查看 CMake 官方文档或社区论坛获取帮助。🚀


注:本文基于 Ubuntu 16.04 LTS 和 CMake 3.25.3 编写。如果你使用的是其他版本,步骤可能略有不同。建议在生产环境部署前先在测试环境验证。

发表回复

后才能评论