链接器说未定义的函数引用

时间:2013-08-02 17:12:48

标签: c linkage

有人可以向我解释这个吗?

文件a如下:

file a.c
#include <stdio.h>
#include <stdlib.h>

int fun1();
int main()
{
     fun1();
     return 0;
}

文件b写为:

file b.c
static int fun1();
int  fun1(){
     printf("fron fun1");
     return 0;
}

当我尝试编译代码时,编译器会给出错误:对fun1的未定义引用。 如果我在文件b.c中声明fun1 static是什么意思?

5 个答案:

答案 0 :(得分:3)

如果在b.c中将fun1声明为static,则它在外部不可见,因此您只能在编译单元b.c中使用它。放下static

注意:为了能够编译代码,您还需要在b.c的顶部添加#include <stdio.h>

答案 1 :(得分:0)

使用extern中的a.c作为extern int fun1();

注意:默认情况下fun1()有外部链接。

并从static int fun1();

中删除b.c

使用编译:

gcc -o test a.c b.c

答案 2 :(得分:0)

好吧,您要在文件b.c中询问此行为。

当您像函数一样声明某个static时,该函数仅在声明它的同一翻译单元中可见,换句话说,您在{{1}中有一个函数}只存在,因此可以在b.c中使用。

所以你的链接器正在考虑b.c内的函数而不是一个选项,这会留下一个未定义的引用,因为此代码中没有其他实现能够解决这个符号。 / p>

答案 3 :(得分:0)

编译错误的原因: 在文件“a.c”中没有函数fun1()的定义。

解决方案1:

declare fun1() as extern in "a.c" : extern int fun1();

解决方案2:

Add #include "b.c" in "a.c"

答案 4 :(得分:0)

您定义的static函数仅在该文件中可见,即它对于该翻译单元是本地的。

这就是编译器(链接器)无法找到该函数的定义的原因。 删除static关键字。

对于编译,只有函数原型就足够了,但是在链接时你必须确保你声称在编译期间存在的函数确实存在于其他一些文件中。但是通过将其声明为static,您将函数的定义限制为仅限于该文件,而不是使其对需要(调用)它的文件可见。