C++解决adb push存在带中文或空格路径的问题:不用带路径,直接当前目录

本文介绍了使用ADB工具推送文件到设备的方法,特别关注了如何处理文件名中包含空格的情况。通过给文件名添加双引号,可以顺利将含有空格的文件名识别为单一参数进行推送。但文件名含有中文时,则会出现字节缺失的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

路径中有带中文或空格解决:不用带路径

加双引号可以解决空格问题。比如a ll.json ,OK

adb push "all.json" /sdcard/ft/
adb push "pcba.json" /sdcard/ft/

cmd里 文件名含空格没问题

adb push "a ll.json" /sdcard/ft/

这样行。

		system("adb.exe push \"a ll.json\" /sdcard/ft/\n");

如果文件名含中文呢?暂时不行。文件名会少字节。

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! 什么意思
03-18
<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输出日志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值