CMake、GNU和STM32:\测试编译器时退出链接错误

CMake、GNU和STM32:\测试编译器时退出链接错误,cmake,arm,stm32,Cmake,Arm,Stm32,我正在将STM32F4的IAR代码移植到OSX/GNU/CMake 我已经定义了一个工具链文件ARM.cmake来使用ARM-none-eabi-g++/gcc。当我运行cmake(引用工具链文件)时,当它尝试链接简单测试程序时,我会得到一个错误。它抱怨没有定义_exit() 我知道正在调用exit(),它会调用它希望在别处找到的_exit()。也许当我最终链接到我的RTO时,它将对此进行定义,或者我必须自己定义它。与此同时,我如何通过编译器检查 集合(CMAKE\U系统\U名称通用) 设置(C

我正在将STM32F4的IAR代码移植到OSX/GNU/CMake

我已经定义了一个工具链文件ARM.cmake来使用ARM-none-eabi-g++/gcc。当我运行cmake(引用工具链文件)时,当它尝试链接简单测试程序时,我会得到一个错误。它抱怨没有定义_exit()

我知道正在调用exit(),它会调用它希望在别处找到的_exit()。也许当我最终链接到我的RTO时,它将对此进行定义,或者我必须自己定义它。与此同时,我如何通过编译器检查

集合(CMAKE\U系统\U名称通用)

设置(CMAKE_系统_处理器STM32F407)

集合(CMAKE_C_编译器arm none eabi gcc)

集合(CMAKE_CXX_编译器arm-none-eabi-g++)


只需添加一个空函数void _exit(int status){}。如果您想了解更多信息,请点击此处:

包括CMake include文件CMakeForceCompiler并使用“FORCE”宏解决了问题。间接地回答

包括(CMakeForceCompiler)

集合(CMAKE\U系统\U名称通用)

设置(CMAKE_系统_处理器STM32F407)

CMAKE_FORCE_C_编译器(arm none eabi gcc GNU)

CMAKE_FORCE_CXX_编译器(arm-none-eabi-g++GNU)


如果不需要或不想要系统调用,可以使用
nosys.specs

下面是我们针对Cortex-M的
arm gcc
的一个片段:

string(CONCAT CM4_LINK_FLAGS
    "--specs=nosys.specs "  # firmware has no syscall implementation
    "-lnosys "              # syscalls are empty stubs
    "-lc"                   # libc with nosys.spec uses newlib-nano
    )

set(CMAKE_EXE_LINKER_FLAGS "${CM4_LINK_FLAGS}" CACHE INTERNAL "")
如果这在您的工具链文件中,您可以通过使用
-DCMAKE\u toolchain\u file=
调用CMake从命令行加载它。因为它是在第一个
项目
指令之前加载的,所以CMake在编译器探索期间使用这些标志,它的小测试文件将成功编译和链接

或者,完全跳过编译器探索,方法是:

set(CMAKE_C_COMPILER_WORKS ON)
set(CMAKE_CXX_COMPILER_WORKS ON)

您正在显式地为固定的体系结构设置已知的编译器;也许您还显式设置了标志,不需要CMake来查询工具链。

将CMake_TRY_COMPILE_TARGET_TYPE设置为STATIC_LIBRARY会跳过链接步骤,并解决链接过程中缺少函数和缺少链接器文件的问题

因此,在工具链文件中:

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

(强制编译器是一个不推荐使用的函数,如果可能的话应该避免)

谢谢。我知道这将如何帮助链接我的应用程序,但这会让我通过cmake执行的编译器检查吗?我不确定我是否理解这些检查是如何发现我创建的某个对象文件或库包含我的空_exit()。很抱歉,我还没有阅读链接。明天我恢复这个项目时我会这么做。如果我原来的帖子不清楚的话,我想我会把问题放在漏斗里。如果你在链接阶段,那么你的源代码已经被编译器检查并编译过了。或者我遗漏了什么?CMake似乎有一些测试文件,它在开始之前编译作为检查。也许是一个空的主管道或者别的什么。我应该明确指出,在测试C/C++编译器时,它没有通过编译/链接步骤。CMake然后带着一个错误退出,我的项目生成文件不会生成。如果我通过了这个步骤,那么我可以添加我的_exit()定义,我的项目将链接OK。只是不知道如何告诉测试代码使用它。