如何修复“.c:6:对'printf'的未定义引用

问题描述 投票:1回答:1

我是新生,我​​想学习ARM汇编语言并使用gnu工具链,所以我决定从小型项目开始,它将arm-assembly文件和C文件混合在一起gnu toolchain。我的想法是调用在汇编文件中定义的函数。

multi.S:

   .globl multi
multi:
    str     fp,[sp,#-4]!
    add     fp,sp,#0
    sub     sp,sp,#12
    str     r0,[fp,#-8]
    str     r1,[fp,#-12]
    ldr     r3,[fp,#-8]
    ldr     r2,[fp,#-12]
    mul     r1,r2,r3
    mov     r3,r1
    mov     r0,r3
    add     sp,fp,#0
    ldr     fp,[sp],#4
    bx      lr

multi.c:

#include <stdio.h>
unsigned int multi(unsigned int a, unsigned int b);

int main(int argc, char *argv[]){
    unsigned int x = multi(3,4);
    printf("%u\n",x);
    return 0;
}

然后我尝试使用如下命令将它们链接在一起:

arm-none-eabi-gcc -g -c -o multi-arm.o multi.S
arm-none-eabi-gcc -g -c -o multi.o multi.c
arm-none-eabi-ld multi.o multi-arm.o -o multi.elf

但是发生了一些错误:

  1. 警告:找不到条目符号_start;默认为0000000082000000 =>我通过添加-lc --entry main解决了这个问题,并且警告消息消失了。
  2. multi.c:6:对'printf'的未定义引用。我坚持这个错误,它花了我2个小时寻找sulution但我仍然无法解决它。

以上是我的问题。谢谢大家的阅读。

c assembly arm gnu toolchain
1个回答
0
投票

试试这个

arm-none-eabi-as -g -o multi-arm.o multi.S
arm-none-eabi-gcc -g -o multi.elf multi.c multi-arm.o

如果要直接使用链接器,则必须在命令行上提供C库的路径。 Gcc在调用链接器时知道库的位置(相对于它执行的位置和编译的位置),但由于某些奇怪的原因,ld没有。

© www.soinside.com 2019 - 2024. All rights reserved.