在 C 编程中,编译时出现“未定义引用”错误是什么?

In C programming, what is `undefined reference`error, when compiling?

我在 linux ubuntu.

中尝试编译以下简单程序

Main.c:

#include <stdio.h>
#include "Person.h"

int main()
{   
    struct Person1 p1 = Person1_Constructor(10, 1000);
}

Person.c:

#include <stdio.h>
#include "Person.h"

struct Person1 Person1_Constructor(const int age, const int salary)
{
    struct Person1 p;
    p.age = age;
    p.salary = salary;
    return p;
};

Person.h:

struct Person1
{
    int age, salary;
};
struct Person1 Person1_Constructor(const int age, const int salary);

为什么我会得到以下 错误

/tmp/ccCGDJ1k.o: In function `main':
Main.c:(.text+0x2a): undefined reference to `Person1_Constructor'
collect2: error: ld returned 1 exit status

我正在使用gcc Main.c -o Main编译。

当您 link 程序时,您需要同时提供 Main.o 和 Person.o 作为输入。

构建通常分两步完成 (1) 编译和 (2) linking。 要编译您的源代码,请执行以下操作:

$ gcc -c -o Main.o Main.c
$ gcc -c -o Person.o Person.c

或一行:

$ gcc -c Main.c Person.c

然后生成的目标文件必须link编辑成单个可执行文件:

$ gcc -o Main Main.o Person.o

对于像您这样的几个编译单元的小型项目,两个步骤都可以在一次 gcc 调用中完成:

$ gcc -o Main Main.c Person.c

必须给出两个文件,因为 Person.c 中的一些符号被 Main.c 使用。

对于更大的项目,两步过程只允许编译在可执行文件生成期间更改的内容。通常这是通过 Makefile 完成的。

问题的发生可能是因为当您需要同时编译 Main.cPerson.c 时,您只编译了 Main.c。尝试将其编译为 gcc Main.c Person.c -o MyProgram.

当你有多个文件时,编译时都需要指定它们,以便解析外部引用,就像这里的情况一样。编译器将吐出目标文件,这些文件稍后将链接到可执行文件中。查看有关 makefile 的教程:Make File Tutorial 它有助于自动执行此过程。