老铁爱金衫 2026-02-27 06:45 采纳率: 98.9%
浏览 2
已采纳

CARLA源码编译时提示“cmake version too old”,如何解决?

CARLA源码编译时提示“cmake version too old”,通常因官方要求CMake ≥ 3.13.4(v0.9.13+ 更推荐 ≥ 3.16),而系统默认版本(如Ubuntu 18.04自带CMake 3.10)不满足。解决方法:**优先通过官方二进制包升级**——下载最新CMake Linux x86_64 .sh 安装包(https://cmake.org/download/),执行 `chmod +x cmake-*.sh && sudo ./cmake-*.sh --skip-license --prefix=/usr/local`;随后验证 `cmake --version` 并确保 `/usr/local/bin` 在 `$PATH` 前置位(可检查 `which cmake`)。避免使用`apt upgrade cmake`(Ubuntu源长期滞后),也无需卸载旧版——新版安装至`/usr/local`后自动优先调用。若用conda环境,`conda install -c conda-forge cmake`亦可快速更新。升级后重新运行`make launch`或`./Util/Build.sh`即可消除该错误。
  • 写回答

1条回答 默认 最新

  • 璐寶 2026-02-27 06:45
    关注
    ```html

    一、现象层:错误表征与触发场景

    CARLA源码编译过程中出现明确报错:cmake version too old,常伴随提示如 CMake 3.10.2 found, but at least CMake 3.13.4 is required。该错误在执行 make launch./Util/Build.shcmake .. 阶段高频触发,尤其集中于 Ubuntu 18.04/20.04(默认 CMake 3.10.2/3.16.3)、CentOS 7(CMake 2.8/3.11)等长期支持发行版。CARLA v0.9.13+ 显式依赖 C++17 特性(如 std::optional、模块化构建逻辑)及现代 CMake 的 find_package(... CONFIG REQUIRED) 行为,旧版 CMake 缺乏对 cmake_minimum_required(VERSION 3.16)FetchContent_Declaretarget_link_libraries(... PRIVATE) 等语义的完整支持。

    二、机理层:版本不兼容的技术根因

    • ABI/API 断层:CMake 3.13 引入 cmake_path 模块,3.15 增强 find_package 的隐式 CONFIG 模式,3.16 正式支持 add_subdirectory(... EXCLUDE_FROM_ALL) —— CARLA 的 CMakeLists.txt 大量依赖这些特性;
    • 工具链耦合失效:CARLA 构建系统通过 ExternalProject_Add 集成 Boost、libpng、rpclib 等子项目,旧版 CMake 在处理嵌套 configure_step 时存在环境变量继承缺陷;
    • Ubuntu APT 仓库策略:官方源将 CMake 视为“基础系统工具”,冻结版本以保障稳定性(如 Ubuntu 18.04 LTS 锁定 CMake 3.10.2),导致开发者无法通过 apt update && apt install cmake 获取合规版本。

    三、方案层:多环境适配的升级路径

    环境类型推荐操作关键参数说明验证命令
    原生 Linux(Ubuntu/CentOS)下载官方 .sh 二进制包安装--prefix=/usr/local 确保路径优先级;--skip-license 跳过交互式协议which cmake && cmake --version
    Conda 环境conda install -c conda-forge cmake=3.28.3conda-forge 提供持续更新的 CMake 构建,自动管理 $CONDA_PREFIX/bin PATHconda list cmake

    四、实践层:可复现的终端操作流

    # 1. 清理潜在干扰(非必需,但推荐)
    sudo apt remove cmake  # 仅当旧版冲突 PATH 时执行,不影响 /usr/local
    
    # 2. 下载并安装官方二进制(以 3.28.3 为例)
    wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.sh
    chmod +x cmake-3.28.3-linux-x86_64.sh
    sudo ./cmake-3.28.3-linux-x86_64.sh --skip-license --prefix=/usr/local
    
    # 3. 确保 PATH 优先级(写入 ~/.bashrc 或 ~/.zshrc)
    echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
    source ~/.bashrc
    
    # 4. 验证生效
    which cmake  # 应输出 /usr/local/bin/cmake
    cmake --version  # 应显示 3.28.3
    

    五、进阶层:构建系统深度协同要点

    升级 CMake 后需同步检查三项隐式依赖:

    1. Python 绑定生成:CARLA 的 setup.py 调用 cmake -DPYTHON_EXECUTABLE=...,需确保 CMake 可识别 Python 3.8+ 的 FindPython3.cmake 模块(3.12+ 内置);
    2. GPU 编译器兼容性:若启用 CUDA 支持(-DCARLA_BUILD_CUDA=ON),CMake ≥ 3.18 才能正确解析 cuda_architectures 属性;
    3. 缓存清理强制性:旧版 CMake 生成的 build/CMakeCache.txtbuild/CMakeFiles/ 必须彻底删除,否则 cmake .. 会复用错误配置缓存。

    六、诊断层:自动化检测与预防脚本

    以下 Bash 函数可集成至 CI/CD 或本地开发环境:

    function check_cmake_compatibility() {
      local req_ver="3.16"
      local cur_ver=$(cmake --version | grep -oE '[0-9]+\.[0-9]+\.[0-9]+')
      if [[ $(printf "%s\n%s" "$req_ver" "$cur_ver" | sort -V | head -n1) != "$req_ver" ]]; then
        echo "❌ CMake $cur_ver < required $req_ver. Please upgrade."
        return 1
      else
        echo "✅ CMake $cur_ver meets CARLA requirement."
        return 0
      fi
    }
    

    七、演进层:CARLA 构建生态趋势洞察

    随着 CARLA 迁移至 Unreal Engine 5.3+(v0.9.15+ 计划),其构建系统正逐步引入 CMakePresets.jsonToolchain files 标准化机制。这意味着未来版本将更严格依赖 CMake ≥ 3.20 的 include(CMakePackageConfigHelpers)write_basic_package_version_file() 功能。建议团队建立 cmake-version-check.sh 钩子,嵌入 Git pre-commit 或 Makefile 依赖检查中,实现版本治理左移。

    八、可视化层:升级决策流程图

    graph TD A[检测到 cmake version too old] --> B{是否使用 Conda?} B -->|是| C[conda install -c conda-forge cmake] B -->|否| D{是否具备 root 权限?} D -->|是| E[下载 .sh 官方包 → /usr/local] D -->|否| F[使用 cmake-install via pip: pipx install cmake] C --> G[验证 which cmake && cmake --version] E --> G F --> G G --> H[清理 build/ 目录] H --> I[重新执行 ./Util/Build.sh]
    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 2月28日
  • 创建了问题 2月27日