[英]CMake, GNU, and STM32: _exit Link Error when Testing Compiler
我正在將代碼從 Windows 上的 IAR 移植到 STM32F4 到 OSX/GNU/CMake。
我已經定義了一個工具鏈文件 ARM.cmake 來使用 arm-none-eabi-g++/gcc。 當我運行 cmake(引用工具鏈文件)時,當它嘗試鏈接簡單的測試程序時出現錯誤。 它抱怨 _exit() 未定義。
我知道正在調用 exit() 並且它調用 _exit() 它希望在其他地方找到它。 也許當我最終鏈接到我的 RTOS 時,它會定義這個,或者我必須自己定義它。 與此同時,我如何通過編譯器檢查?
設置(CMAKE_SYSTEM_NAME 通用)
設置(CMAKE_SYSTEM_PROCESSOR STM32F407)
設置(CMAKE_C_COMPILER arm-none-eabi-gcc)
設置(CMAKE_CXX_COMPILER arm-none-eabi-g++)
包括CMake包含文件CMakeForceCompiler並使用“ FORCE”宏解決了該問題。 這里間接回答。
包括(CMakeForceCompiler)
設置(通用的CMAKE_SYSTEM_NAME)
設置(CMAKE_SYSTEM_PROCESSOR STM32F407)
CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU)
CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-g ++ GNU)
只需添加一個空函數void _exit(int status){}。 在此處查看是否需要更多信息: http : //stm32discovery.nano-age.co.uk/open-source-development-with-the-stm32-discovery/getting-newlib-to-work-with-stm32-and-代碼的Sourcery -精簡版,EABI
如果不需要或不需要syscall,可以使用nosys.specs
。
這是針對Cortex-M的arm-gcc
CMake工具鏈文件的摘錄:
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_TOOLCHAIN_FILE=<path-to-your-toolchain>
調用CMake,從命令行加載該文件。 由於它是在第一個project
指令之前加載的,因此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)
(強制編譯器是一個不推薦使用的函數,應盡可能避免)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.