gpt4 book ai didi

c - 如何让ld链接头文件中的函数?

转载 作者:行者123 更新时间:2023-12-04 08:39:13 25 4
gpt4 key购买 nike

我在 lib.h 中有一个自定义函数 strlen()

inline int strlen(char * String)
{
register int __res;
__asm__ __volatile__ ( "cld \n\t"
"repne \n\t"
"scasb \n\t"
"notl %0 \n\t"
"decl %0 \n\t"
:"=c"(__res)
:"D"(String),"a"(0),"0"(0xffffffff)
:
);
return __res;
}
在printk.c中调用
#include "lib.h"
....
len=strlen(s);
当我尝试链接由 gcc 成功编译的 printk.o 时
ld -b elf64-x86-64 -z muldefs -o system head.o main.o printk.o -T kernel.lds 
我得到
ld: printk.o: in function `vsprintf':
printk.c:(.text+0x7b1): undefined reference to `strlen'
我尝试使用 -L,但它不起作用。
任何想法表示赞赏。

最佳答案

在 C 中,当您将函数声明为 inline 时,您还必须将其声明为 extern在一个(并且只有一个)编译单元中。因此,在您的一个(并且只有一个)具有 #include "lib.h" 的 .c 文件中添加 extern int strlen(char *);在该编译单元中获取内联函数的外部定义,以满足任何未内联的链接请求(无论出于何种原因)。
当您将函数声明为 inline 时没有 extern ,它定义了一个函数版本,如果编译器选择这样做,它可以被内联到任何调用站点中,但不会作为“独立”函数包含在内。但是,不能保证任何给定的调用或使用都将被内联(并且通常只有在启用优化时才会被内联)。因此,如果存在对该函数的任何非内联引用,则需要确保在某处有该函数的外部定义。

关于c - 如何让ld链接头文件中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64647416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com