首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对“`main”和_sbrk的未定义引用--在自己的静态库中启动代码

对“`main”和_sbrk的未定义引用--在自己的静态库中启动代码
EN

Stack Overflow用户
提问于 2016-08-19 11:30:30
回答 1查看 1.4K关注 0票数 0

我正在开发一个Cortex-M4 (STM32F4-探索板),使用GNU ARM嵌入式工具链(gcc-arm-无eabi-5_4-2016q2)。我的代码中与硬件相关的部分(HAL、CMSIS、启动等)是在静态库中构建的,我尝试将其链接到应用程序代码。我的应用程序代码包含一个main符号,我的库包含一个_sbrk符号。以下是错误消息:

代码语言:javascript
复制
engine_control/source/os/release/libkosmos-arm-stm32f4-discovery.a(_startup.o): In function `_start': 
_startup.c:(.after_vectors+0x9a): undefined reference to `main'

以及:

代码语言:javascript
复制
/opt/gcc-arm-none-eabi-5_4-2016q2/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc_nano.a(lib_a-sbrkr.o): In function `_sbrk_r': 
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'

我想我的链接顺序有问题。这是我的链接命令:

代码语言:javascript
复制
arm-none-eabi-g++ -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Os -fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -ffreestanding -fno-move-loop-invariants -Werror -Wunused -Wuninitialized -Wall -Wextra -Wmissing-declarations -Wconversion -Wpointer-arith -Wpadded -Wshadow -Wlogical-op -Waggregate-return -Wfloat-equal -T mem.ld -T libs.ld -T sections.ld -nostartfiles -Xlinker --gc-sections -L"config/linker" --specs=nano.specs -L/home/tkl/git/engine_control/source/os/release -Wl,-Map,"/home/tkl/git/engine_control/release/map/arm/release/.map" -lkosmos-arm-stm32f4-discovery -o "/home/tkl/git/engine_control/release/execute/arm/release/.elf" 

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-08-19 12:12:09

注意,如果您将启动代码放入库中,链接器可能没有很好的理由将其插入--没有人要求它,因为通常情况下,没有其他代码部分会调用它--在链接过程中,您想要在映像中使用的东西(如启动代码)必须是目标文件中的。该对象文件可能应该放在链接行的第一位(因为它通常调用main和所有其他类型的符号,这些符号需要按照链接顺序出现,以便正确地解析符号)。

另一个是sbrk_r抱怨没有引用sbrk --我假设这两个都在您的库中。可以通过通过ranlib运行库来创建适当的索引来解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39037971

复制
相关文章

相似问题

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