首页 > 解决方案 > 如何让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

解决方案


在 C 中,当您将一个函数声明为 时inline,您还必须将它声明为extern一个(且只有一个)编译单元。因此,在您的一个(也是唯一一个).c 文件中,该文件具有#include "lib.h"添加extern int strlen(char *);以获取该编译单元中内联函数的外部定义,以满足任何未内联的链接请求(无论出于何种原因)。

当您将函数声明为inlinewithoutextern时,它定义了该函数的一个版本,该版本可以内联到该编译单元的任何调用站点中,如果编译器选择这样做,但不会作为“独立”函数包含在内。但是,不能保证任何给定的调用或使用都会被内联(通常,只有在启用优化时才会内联)。因此,如果对函数有任何非内联引用,则需要确保某处存在该函数的外部定义。


推荐阅读