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
相关产品推荐
相关产品推荐

