"Undefined reference to function"错误

9
我遇到了一些问题,在使用头文件编译几个文件时。这里是我的代码概述:
file1.c
#include "header.h"
int main() {
    func1();
    return 0;
}

file2.c

#include "header.h"
void func1() {
    ... function implementation ...
}

header.h

void func1();

我遇到的错误是:

在函数 'main' 中:
对于 'func1' 的引用未定义

注意:我只是简单地解释了我的3个文件的设置方式。我需要让这个程序在这三个文件中工作。我已经正确设置/包含了所有内容吗?我需要使用这个设置,但我不确定如何让 file.c 引用实际的 func1() 实现。


2
你使用的编译器是什么?能提供一下你的编译器语句吗? - mathematician1975
3
如果您正在使用gcc -o 程序名 file2.c file1.c命令,请将其更改为gcc -o 程序名 file1.c file2.c。顺序很重要。 - user529758
@H2CO3 - 什么?!?!这跟顺序有什么关系?两种顺序对我来说都可以正常工作。我无论如何都不明白未定义的引用。 - phonetagger
@H2CO3 - 我想看看你所说的例子,或者是一些描述它的页面链接。Tesla看到的错误是链接器错误,而不是编译器错误。在链接阶段,一个文件中的函数应该能够调用另一个文件中的函数,反之亦然。我相信链接器无论指定文件的顺序如何,都不应该有问题完成其工作。 - phonetagger
1
据我所知,顺序只对库文件有影响。也就是说,库文件(-lnameoflib)应该在使用其中符号的源文件之后指定,如果存在库间依赖关系,则库的顺序也很重要,或者必须使用分组选项(链接器然后进入循环组,直到满足所有引用或无法解决为止)。 - mity
显示剩余7条评论
1个回答

4
如果错误是未定义的对 func1() 的引用,并且没有其他错误,那么我认为这是因为您的项目中有两个名为 header.h 的文件,而另一份副本被包含了进来,而不是您声明 func1() 的副本。
我会检查项目中的包含路径,并确保首先包含具有 func1() 声明的 header.h

这个问题很老了,但我遇到了这个问题,希望能得到帮助。基本设置与此问题相同,只是我确定正确的头文件已被包含,因为某些函数不会给出未定义的引用,而有些则会。这很奇怪,如果我危及头文件,那么代码就“正确地”无法编译。 - Vahagn Tumanyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接