使用ARM工具链链接CMake项目时出现多个未定义的引用

ibrsph3r  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(187)

我正在使用CMake开发一个构建系统,以使用arm-none-eabi工具链构建应用程序。

project/
├── apps/
│   ├── test_app
│   │   ├── inc/
│   │   ├── src/
│   │   ├── CMakeLists.txt
├── arch/
│   ├── CMSIS/
│   ├── include/
│   ├── startup/
│   ├── CMakeLists.txt
├── cmake/
│   ├── toolchain-samd51.cmake
├── CMakeLists.txt

这是我的顶级CMakeLists.txt:

cmake_minimum_required(VERSION 3.17)

project(SMALL-FW LANGUAGES C)

add_subdirectory(arch)
add_subdirectory(apps/test_app)

这是工具链cmake文件:


# Set target architecture

set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)

# Set compiler to use

set(CMAKE_C_COMPILER "arm-none-eabi-gcc")

# set(CMAKE_LINKER "arm-none-eabi-ld")

# Clear default compiler and linker flags.

set(CMAKE_C_FLAGS "")
set(CMAKE_C_LINK_FLAGS "")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# FIX - Bypass compiler check

set(CMAKE_C_COMPILER_FORCED TRUE)

# Define common compiler and linker flags

set(ARM_OPTIONS 
    -mthumb
    -mabi=aapcs-linux
    -mcpu=cortex-m4
    -mfpu=fpv4-sp-d16
    -mfloat-abi=softfp
    --specs=nano.specs
    -mlong-calls
    -DSAMD51
)

# Define compiler specific flags

add_compile_options(
    ${ARM_OPTIONS}
    -D__SAMD51J19A__
    -ffunction-sections
    -Wall
)

# Define linker specific flags

add_link_options(
    ${ARM_OPTIONS}
    #--specs=nano.specs
    LINKER:--gc-sections
)

这是arch文件夹中的CMakeList.txt:

add_library(asf OBJECT
    startup/startup_samd51.c
    startup/system_samd51.c
)

# Every target that links against asf needs to know where the ASF headers are.

target_include_directories(asf PUBLIC
    ${CMAKE_CURRENT_SOURCE_DIR}/CMSIS/Include
    ${CMAKE_CURRENT_SOURCE_DIR}/include
)

# Use the custom linker script provided with ASF.

target_link_options(asf PUBLIC
    -T${CMAKE_CURRENT_SOURCE_DIR}/startup/samd51j19a_flash.ld
)

这是一个应用程序CMakeLists.txt:

add_executable(APP)

target_sources(APP PRIVATE src/main.c src/module.c)

target_include_directories(APP PRIVATE inc/)

target_link_libraries(APP asf)

当CMAKE_C_COMPILER_FORCED选项设置为true时,CMake运行良好,但当我尝试创建项目时,它失败了,并出现多个未定义的引用错误,如下所示:
/build/arm-none-eabi-newlib/src/build-nano/arm-none-eabi/thumb/v7e-m+fp/softfp/newlib/libc/reent/../../../../../../../../newlib-4.2.0.20211231/newlib/libc/reent/sbrkr.c:51: undefined reference to_sbrk ''的复数形式
我曾尝试使用nosys.specs标志,但出现了类似的错误。

6jjcrrmo

6jjcrrmo1#

试试这个,看起来像是打印错误


# Define linker specific flags

add_link_options(
    ${ARM_OPTIONS}
    --specs=nano.specs
    --gc-sections
)

相关问题