-- The C compiler identification is GNU 14.3.1 -- The CXX compiler identification is GNU 14.3.1 -- Checking whether C compiler has -isysroot -- Checking whether C compiler has -isysroot - yes -- Checking whether C compiler supports OSX deployment target flag -- Checking whether C compiler supports OSX deployment target flag - no -- Detecting C compiler ABI info -- Detecting C compiler ABI info - failed -- Check for working C compiler: /Applications/ArmGNUToolchain/14.3.rel1/arm-none-eabi/bin/arm-none-eabi-gcc -- Check for working C compiler: /Applications/ArmGNUToolchain/14.3.rel1/arm-none-eabi/bin/arm-none-eabi-gcc - broken CMake Error at /Applications/CLion.app/Contents/bin/cmake/mac/aarch64/share/cmake-4.0/Modules/CMakeTestCCompiler.cmake:67 (message): The C compiler "/Applications/ArmGNUToolchain/14.3.rel1/arm-none-eabi/bin/arm-none-eabi-gcc" is not able to compile a simple test program. It fails with the following output: Change Dir: '/private/var/folders/fk/_f55bj3j2b3g3gkmph9brvy40000gn/T/cmake_check_environment2/_build15339674733102076702/CMakeFiles/CMakeScratch/TryCompile-XV2Mjv' Run Build Command(s): /Applications/CLion.app/Contents/bin/ninja/mac/aarch64/ninja -v cmTC_f0cb2 [1/2] /Applications/ArmGNUToolchain/14.3.rel1/arm-none-eabi/bin/arm-none-eabi-gcc -arch arm64 -fdiagnostics-color=always -o CMakeFiles/cmTC_f0cb2.dir/testCCompiler.c.o -c /private/var/folders/fk/_f55bj3j2b3g3gkmph9brvy40000gn/T/cmake_check_environment2/_build15339674733102076702/CMakeFiles/CMakeScratch/TryCompile-XV2Mjv/testCCompiler.c FAILED: CMakeFiles/cmTC_f0cb2.dir/testCCompiler.c.o /Applications/ArmGNUToolchain/14.3.rel1/arm-none-eabi/bin/arm-none-eabi-gcc -arch arm64 -fdiagnostics-color=always -o CMakeFiles/cmTC_f0cb2.dir/testCCompiler.c.o -c /private/var/folders/fk/_f55bj3j2b3g3gkmph9brvy40000gn/T/cmake_check_environment2/_build15339674733102076702/CMakeFiles/CMakeScratch/TryCompile-XV2Mjv/testCCompiler.c arm-none-eabi-gcc: error: unrecognized command-line option '-arch'; did you mean '-march='? ninja: build stopped: subcommand failed. CMake will not be able to correctly generate this project. Call Stack (most recent call first): CMakeLists.txt:2 (project) -- Configuring incomplete, errors occurred! 错误代码: 1
时间: 2025-08-08 19:06:30 AIGC 浏览: 38
<think>我们正在处理一个CMake配置错误,具体是当使用arm-none-eabi-gcc编译器时,报告无法识别的命令行选项'-arch'。这个错误通常发生在CMake试图检测编译器能力时传递了不支持的选项。根据引用信息,我们可以推断用户可能在使用ARM交叉编译工具链,并且CMake配置中可能错误地包含了针对本地架构(如macOS)的选项。
原因分析:
在macOS系统中,CMake可能会默认添加`-arch`选项来指定目标架构(如x86_64, arm64等)。然而,当使用交叉编译器(如arm-none-eabi-gcc)时,该编译器并不支持macOS特有的`-arch`选项,从而导致配置失败。
解决方案:
我们需要告诉CMake不要使用`-arch`选项,并且明确指定目标系统为嵌入式系统(通常为None或Generic),以避免CMake注入本地平台的编译选项。
步骤:
1. 在CMakeLists.txt中,在`project()`命令之前设置`CMAKE_SYSTEM_NAME`为`Generic`(或者根据实际情况设置为`None`),以指定目标系统为裸机(无操作系统)。
2. 设置`CMAKE_TRY_COMPILE_TARGET_TYPE`为`STATIC_LIBRARY`,以避免CMake在检测编译器时使用链接步骤(因为交叉编译环境可能没有完整的系统库)。
3. 确保在工具链文件中正确设置了编译器,并且没有传递不兼容的选项。
另外,根据引用[1]和[3],我们还需要确保工具链文件正确配置了编译器的路径和前缀。
具体操作:
方法一:修改CMakeLists.txt(推荐)
在CMakeLists.txt的开头,添加以下设置:
```cmake
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
```
方法二:使用工具链文件
创建一个工具链文件,比如`arm-gcc-toolchain.cmake`,内容如下:
```cmake
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)
# 设置编译器路径(根据你的安装路径调整)
set(TOOLCHAIN_PATH /usr/local/arm/gcc-arm-none-eabi-5_4-2016q3) # 参考引用[2]和[3]中的路径
set(CMAKE_C_COMPILER ${TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/bin/arm-none-eabi-g++)
# 设置编译器的通用参数(如果需要)
set(CMAKE_C_FLAGS_INIT "-mcpu=cortex-m4 -mthumb" CACHE STRING "C compiler flags")
set(CMAKE_CXX_FLAGS_INIT "${CMAKE_C_FLAGS_INIT}" CACHE STRING "C++ compiler flags")
# 避免CMake尝试进行链接测试
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# 设置查找库的路径(如果需要)
set(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_PATH})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
```
然后,在配置CMake时指定该工具链文件:
```bash
cmake -DCMAKE_TOOLCHAIN_FILE=arm-gcc-toolchain.cmake ...
```
方法三:如果上述方法无效,检查CMake版本
根据引用[1],建议检查CMake版本,确保使用较新的版本(但也要注意兼容性)。如果CMake版本过旧,可能会存在已知问题。升级CMake或使用与工具链兼容的版本。
注意:在引用[3]中,用户指定了编译器的路径和版本,请确保在工具链文件中正确设置这些路径。
补充说明:
如果用户是在macOS上使用,并且CMake版本较新,可能还需要注意CMake在macOS上的一些默认行为。设置`CMAKE_SYSTEM_NAME`为`Generic`通常可以避免`-arch`选项的传递。
如果问题仍然存在,可以尝试在CMakeLists.txt中手动移除`-arch`选项:
```cmake
# 移除所有编译标志中的-arch选项
string(REGEX REPLACE "-arch [^ ]+" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
string(REGEX REPLACE "-arch [^ ]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
```
但是这种方法可能会影响其他必要的编译选项,所以优先推荐前两种方法。
最后,根据引用[1],如果遇到链接错误,可能需要添加必要的库(如libc.a, libgcc.a等),但当前问题集中在编译选项上,因此先解决编译选项问题。
希望这些方法能够帮助用户解决问题。</think>### CMake配置错误解决方案
当使用arm-none-eabi-gcc交叉编译器时遇到`unrecognized command-line option '-arch'`错误,这是由于CMake尝试传递了不适用于嵌入式编译器的平台特定选项。以下是完整的解决步骤:
#### 1. **设置目标系统类型**
在CMakeLists.txt开头添加:
```cmake
set(CMAKE_SYSTEM_NAME Generic) # 指定为裸机系统
set(CMAKE_SYSTEM_PROCESSOR ARM) # 明确处理器架构
```
#### 2. **禁用编译器测试**
在`project()`命令前添加:
```cmake
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # 跳过链接测试
```
#### 3. **创建工具链文件(推荐)**
新建`arm-gcc-toolchain.cmake`文件:
```cmake
# 编译器路径(根据实际安装路径修改)
set(TOOLCHAIN_PATH /usr/local/arm/gcc-arm-none-eabi-5_4-2016q3) # 参考[^2][^3]
# 设置编译器
set(CMAKE_C_COMPILER ${TOOLCHAIN_PATH}/bin/arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/bin/arm-none-eabi-g++)
# 目标系统配置
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR ARM)
# 禁用编译器测试
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# 添加必要编译选项
add_compile_options(-mcpu=cortex-m4 -mthumb -specs=nosys.specs)
```
#### 4. **配置CMake时指定工具链**
```bash
cmake -DCMAKE_TOOLCHAIN_FILE=arm-gcc-toolchain.cmake ..
```
#### 关键修改说明:
1. **`CMAKE_SYSTEM_NAME Generic`**
告知CMake目标系统是裸机环境(无操作系统),阻止注入主机平台选项(如macOS的`-arch`)[^1]
2. **`CMAKE_TRY_COMPILE_TARGET_TYPE`**
避免CMake执行完整的编译-链接测试,这些测试在交叉编译环境中常失败[^1]
3. **工具链文件**
集中管理交叉编译设置,确保选项一致性(如指定`-mthumb`等ARM专用选项)[^3]
#### 验证配置:
检查生成的CMakeCache.txt文件:
```
// C compiler
CMAKE_C_COMPILER:FILEPATH=/usr/local/arm/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-gcc
// Target system
CMAKE_SYSTEM_NAME:STRING=Generic
```
> **注意**:如果仍出现`-arch`错误,检查CMakeLists.txt中是否包含`enable_language(ASM)`语句,嵌入式项目需使用`enable_language(ASM_ARM)`替代
阅读全文
相关推荐








