You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake使用arm-none-eabi-gcc编译时出现undefined reference to "_exit"错误

问题根因

报错是因为CMake编译器兼容性测试的执行时机早于你目标链接参数的设置时机:CMake在执行project()指令时就会先尝试编译一个简单C测试程序验证编译器可用,此时你在add_executable之后配置的target_link_options还没有生效,测试程序链接时缺少-specs=nosys.specs参数,就会出现_exit未定义的报错。而你手动编译时直接携带了对应参数,所以可以正常生成可执行文件。


解决方案

1. 全局前置配置链接参数(最推荐)

在project()指令之前就设置全局的可执行文件链接参数,让编译器测试阶段就能拿到nosys.specs配置,修改后的CMakeLists.txt示例如下:

cmake_minimum_required(VERSION 3.12)
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_STANDARD 99)

# 新增:全局配置链接参数,提前到project指令前生效
set(CMAKE_EXE_LINKER_FLAGS_INIT "-specs=nosys.specs")
# 如果项目用到C++可同时加下面这句
# set(CMAKE_CXX_LINKER_FLAGS_INIT "-specs=nosys.specs")

# Project variables
set(LOCAL_PROJECT_NAME        "C-Sandbox")
set(LOCAL_PROJECT_VERSION     "0.0.1")
set(LOCAL_PROJECT_DESCRIPTION "Description")

# Project setup
project(${LOCAL_PROJECT_NAME}
        VERSION ${LOCAL_PROJECT_VERSION}
        DESCRIPTION ${LOCAL_PROJECT_DESCRIPTION}
        LANGUAGES C)

add_executable(${LOCAL_PROJECT_NAME})

target_sources(${LOCAL_PROJECT_NAME} PRIVATE src/main.c)
# 原有target_link_options可以保留也可以删除,全局配置后目标会自动继承参数
# target_link_options(${LOCAL_PROJECT_NAME} PRIVATE "-specs=nosys.specs")
set_target_properties(${LOCAL_PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "bin")

2. 跳过编译器测试(仅临时验证用,不推荐)

如果不需要CMake验证编译器可用性,可以在project()指令前加以下配置直接跳过测试环节:

set(CMAKE_C_COMPILER_WORKS TRUE CACHE BOOL "C compiler works" FORCE)
# 用到C++的话加下面这句
# set(CMAKE_CXX_COMPILER_WORKS TRUE CACHE BOOL "C++ compiler works" FORCE)

生效验证

修改完成后请删除之前生成的build目录下的所有缓存文件,再重新执行你的cmake配置命令即可解决报错。

内容的提问来源于stack exchange,提问作者Gary Allen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:24:02