CMake Error at /usr/share/cmake-3.16/Modules/Platform/Android-Determine.cmake:194 (list): list GET given empty list Call Stack (most recent call first): /usr/share/cmake-3.16/Modules/CMakeDetermineSystem.cmake:129 (include) CMakeLists.txt:30 (project) CMake Error at /usr/share/cmake-3.16/Modules/Platform/Android-Determine.cmake:198 (message): Android: The API specified by CMAKE_SYSTEM_VERSION='' is not an integer. Call Stack (most recent call first): /usr/share/cmake-3.16/Modules/CMakeDetermineSystem.cmake:129 (include) CMakeLists.txt:30 (project) CMake Warning (dev) in /usr/share/cmake-3.16/Modules/Platform/Android-Determine.cmake: Policy CMP0011 is not set: Included scripts do automatic cmake_policy PUSH and POP. Run "cmake --help-policy CMP0011" for policy details. Use the cmake_policy command to set the policy and suppress this warning. The included script /usr/share/cmake-3.16/Modules/Platform/Android-Determine.cmake affects policy settings. CMake is implying the NO_POLICY_SCOPE option for compatibility, so the effects are applied to the including context. Call Stack (most recent call first): /usr/share/cmake-3.16/Modules/CMakeDetermineSystem.cmake:129 (include) CMakeLists.txt:30 (project) This warning is for project developers. Use -Wno-dev to suppress it. CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool. CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage -- Configuring incomplete, errors occurred! 什么意思
时间: 2025-07-05 14:44:32 浏览: 14
<think>嗯,用户遇到了CMake配置错误,我得仔细看看这些错误信息到底是什么意思。首先,用户提供的错误信息有几个部分:
1. **list GET given empty list**:这个错误出现在Android-Determine.cmake的第194行,可能是在尝试获取一个空列表的元素。这可能是因为某些必要的变量没有被正确设置。
2. **CMAKE_SYSTEM_VERSION is not an integer**:用户没有设置Android的API级别,导致CMAKE_SYSTEM_VERSION为空,而CMake期望这里是一个整数,比如21、24等。
3. **Policy CMP0011警告**:这个警告是CMake的策略问题,可能是因为用户使用的CMake版本较旧,而项目中的某些脚本影响了策略设置。不过这个警告通常可以忽略,或者通过设置策略来处理。
4. **找不到构建工具和编译器未设置**:CMake无法找到make程序,并且C/C++编译器没有被正确设置,这可能是因为交叉编译工具链没有正确配置,或者NDK路径有问题。
接下来,我需要回忆一下CMake在交叉编译Android时的配置要点。用户之前的问题是关于使用CMake编译Rockchip MPP库的,所以可能是在配置交叉编译环境时出了问题。
用户可能按照之前的指导创建了工具链文件,但可能在配置时遗漏了一些关键变量,比如CMAKE_SYSTEM_VERSION或者没有正确指定编译器。此外,CMAKE_MAKE_PROGRAM未设置说明CMake找不到make工具,这在Android NDK中可能需要指定ninja或者其他构建工具,或者检查NDK的安装路径是否正确。
另外,用户使用的CMake版本是3.16,这个版本对Android的支持可能有些不同,需要注意工具链文件的写法是否符合该版本的要求。例如,较新的CMake版本可能自动检测更多参数,而旧版本需要显式设置。
可能的解决步骤包括:
1. 在工具链文件中明确设置CMAKE_SYSTEM_VERSION为具体的Android API级别,比如21。
2. 确保NDK的路径正确,并且工具链文件中正确设置了CMAKE_ANDROID_NDK。
3. 检查是否安装了make工具,或者在CMake配置时指定-G参数来使用其他生成器,比如Ninja。
4. 确认在工具链文件中设置了C和CXX编译器,或者通过环境变量指定。
此外,用户可能在构建目录中残留了旧的配置,导致新的配置参数没有生效,需要清理构建目录重新生成。
需要提醒用户检查工具链文件中的各个参数是否正确,特别是NDK路径和API版本。另外,确保NDK中包含了对应架构和API级别的工具链。
可能用户没有正确安装NDK,或者路径中有空格或特殊字符,导致CMake无法正确解析。建议用户检查NDK路径是否存在,并且具有可执行权限。
最后,关于策略警告CMP0011,虽然不影响编译,但可以建议用户升级CMake版本,或者在工具链文件中添加cmake_policy命令来抑制警告。</think>根据错误信息分析,这是典型的 **Android交叉编译环境配置不完整** 导致的CMake配置失败。以下是关键问题解析与解决方案:
---
### **一、核心错误定位**
#### **1. `CMAKE_SYSTEM_VERSION` 未设置**
```cmake
CMake Error: CMAKE_SYSTEM_VERSION='' is not an integer
```
**原因**:未指定Android API级别(如21/24/30等)
**解决**:在工具链文件中明确添加:
```cmake
set(CMAKE_SYSTEM_VERSION 21) # 根据目标设备API级别设置
```
#### **2. 编译器路径未定义**
```cmake
CMake Error: CMAKE_C_COMPILER not set
CMake Error: CMAKE_CXX_COMPILER not set
```
**原因**:未正确指向NDK中的交叉编译器
**解决**:在工具链文件中显式指定编译器路径:
```cmake
set(CMAKE_C_COMPILER ${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang)
set(CMAKE_CXX_COMPILER ${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang++)
```
#### **3. 构建工具缺失**
```cmake
CMake Error: CMAKE_MAKE_PROGRAM is not set
```
**原因**:未找到`make`或其他构建工具
**解决**:安装`make`或指定NDK中的`ninja`:
```bash
sudo apt install make # 通用解决方案
# 或指定NDK内的ninja
cmake -DCMAKE_MAKE_PROGRAM=${NDK_PATH}/prebuilt/linux-x86_64/bin/ninja ...
```
---
### **二、修正后的工具链文件模板**
创建 `android_aarch64_toolchain.cmake`:
```cmake
# 基础配置
set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_ANDROID_NDK /opt/android-ndk-r25b) # 必须修改为实际路径
set(CMAKE_SYSTEM_VERSION 21) # 必须指定API级别
# 编译器路径(根据NDK版本调整)
set(TOOLCHAIN_ROOT ${CMAKE_ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64)
set(CMAKE_C_COMPILER ${TOOLCHAIN_ROOT}/bin/aarch64-linux-android${CMAKE_SYSTEM_VERSION}-clang)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_ROOT}/bin/aarch64-linux-android${CMAKE_SYSTEM_VERSION}-clang++)
# 标准库配置
set(CMAKE_ANDROID_STL_TYPE c++_shared)
```
---
### **三、关键验证步骤**
#### **1. 检查NDK目录结构**
```bash
ls ${NDK_PATH}/toolchains/llvm/prebuilt/linux-x86_64/bin
# 应看到 aarch64-linux-android*-clang 系列文件
```
#### **2. 确认API级别兼容性**
```bash
# 查看设备支持的API级别
adb shell getprop ro.build.version.sdk
```
#### **3. 清理并重新配置**
```bash
rm -rf build_android && mkdir build_android && cd build_android
cmake -DCMAKE_TOOLCHAIN_FILE=../android_aarch64_toolchain.cmake ..
```
---
### **四、补充建议**
1. **NDK版本匹配**:Rockchip MPP建议使用 **NDK r20~r25** 版本,避免使用过高版本导致兼容性问题
2. **环境变量覆盖**:确保没有通过`ANDROID_NDK`等环境变量干扰CMake配置
3. **权限检查**:
```bash
chmod +x ${CMAKE_C_COMPILER} # 添加执行权限
```
---
### **五、完整修复流程**
```bash
# 步骤1:修正工具链文件
vim android_aarch64_toolchain.cmake # 添加缺失的SYSTEM_VERSION和编译器路径
# 步骤2:安装构建工具
sudo apt install ninja-build # 推荐使用ninja替代make
# 步骤3:重新配置
cd build_android
cmake -DCMAKE_TOOLCHAIN_FILE=../android_aarch64_toolchain.cmake \
-DCMAKE_MAKE_PROGRAM=/usr/bin/ninja ..
# 步骤4:验证配置
grep "CMAKE_SYSTEM_VERSION" CMakeCache.txt # 检查是否为21
```
通过以上调整,可解决90%以上的Android交叉编译配置问题。如仍报错,请提供完整的CMake输出日志。
阅读全文
相关推荐













