c - 如何让ld链接头文件中的函数?
问题描述
我在 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);
当我尝试链接 printk.o 时,gcc 已成功编译
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
一个(且只有一个)编译单元。因此,在您的一个(也是唯一一个).c 文件中,该文件具有#include "lib.h"
添加extern int strlen(char *);
以获取该编译单元中内联函数的外部定义,以满足任何未内联的链接请求(无论出于何种原因)。
当您将函数声明为inline
withoutextern
时,它定义了该函数的一个版本,该版本可以内联到该编译单元的任何调用站点中,如果编译器选择这样做,但不会作为“独立”函数包含在内。但是,不能保证任何给定的调用或使用都会被内联(通常,只有在启用优化时才会内联)。因此,如果对函数有任何非内联引用,则需要确保某处存在该函数的外部定义。