我正在使用 GNU ARM 嵌入式工具链 (gcc-arm-none-eabi-5_4-2016q2) 开发 Cortex-M4(STM32F4-Discovery 板)。我的代码的硬件相关部分(HAL-lib、CMSIS、启动等)构建在静态库中,我尝试将其链接到我的应用程序代码。我的应用程序代码包含一个 main
符号,我的库包含一个 _sbrk
符号。这些是错误消息:
engine_control/source/os/release/libkosmos-arm-stm32f4-discovery.a(_startup.o): In function `_start':
_startup.c:(.after_vectors+0x9a): undefined reference to `main'
和:
/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'
我认为我的链接顺序有问题。这是我的链接命令:
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"
我做错了什么?
最佳答案
请注意,如果您将启动代码放入库中,链接器可能没有充分的理由将其拉入 - 没有人要求它,因为通常没有代码的其他部分调用它 - 您不惜一切代价想要在图像中添加的东西就像链接期间需要启动代码位于目标文件中一样。该目标文件可能应该首先出现在链接行上(因为它通常调用 main
和所有其他类型的符号,并且这些符号需要按照链接顺序出现在它之后为了正确解析符号)。
另一个是 sbrk_r
提示没有引用 sbrk
- 我假设这两个都在你的库中。通过 ranlib
运行您的库以创建正确的索引可以解决此问题。
关于c - 对 `main' 和 _sbrk 的 undefined reference - 自己的静态库中的启动代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39037971/