簡體   English   中英

CMake、GNU 和 STM32:測試編譯器時出現 _exit 鏈接錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM