首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ARM工具链链接CMake项目期间的多个未定义引用

使用ARM工具链链接CMake项目期间的多个未定义引用
EN

Stack Overflow用户
提问于 2022-11-10 14:26:39
回答 1查看 27关注 0票数 0

我正在使用CMake开发一个构建系统,使用arm-无eabi工具链构建应用程序。这是我的文件夹结构:

代码语言:javascript
复制
project/
├── apps/
│   ├── test_app
│   │   ├── inc/
│   │   ├── src/
│   │   ├── CMakeLists.txt
├── arch/
│   ├── CMSIS/
│   ├── include/
│   ├── startup/
│   ├── CMakeLists.txt
├── cmake/
│   ├── toolchain-samd51.cmake
├── CMakeLists.txt

这是我的顶级CMakeLists.txt:

代码语言:javascript
复制
cmake_minimum_required(VERSION 3.17)

project(SMALL-FW LANGUAGES C)

add_subdirectory(arch)
add_subdirectory(apps/test_app)

这是工具链cmake文件:

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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选项设置为true时,CMAKE_C_COMPILER_FORCED运行良好,但当我试图使项目失败时,会出现多个未定义的引用错误,如下一个错误:

/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标志,但也会发生类似的错误。

EN

回答 1

Stack Overflow用户

发布于 2022-11-10 16:32:09

试试这个,看上去像打错字了

代码语言:javascript
复制
# Define linker specific flags
add_link_options(
    ${ARM_OPTIONS}
    --specs=nano.specs
    --gc-sections
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74390626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档