在C编程中,编译时什么是`undefined reference`error?

dim*_*s93 6 c undefined-reference

我有以下简单的程序,我试图在linux ubuntu中编译.

Main.c:

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

int main()
{   
    struct Person1 p1 = Person1_Constructor(10, 1000);
}
Run Code Online (Sandbox Code Playgroud)

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;
};
Run Code Online (Sandbox Code Playgroud)

Person.h:

struct Person1
{
    int age, salary;
};
struct Person1 Person1_Constructor(const int age, const int salary);
Run Code Online (Sandbox Code Playgroud)

为什么我会收到以下错误

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

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

Die*_*ego 5

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

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

$ gcc -c -o Main.o Main.c
$ gcc -c -o Person.o Person.c
Run Code Online (Sandbox Code Playgroud)

或者在一行中:

$ gcc -c Main.c Person.c
Run Code Online (Sandbox Code Playgroud)

然后必须将生成的目标文件链接到单个可执行文件中:

$ gcc -o Main Main.o Person.o
Run Code Online (Sandbox Code Playgroud)

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

$ gcc -o Main Main.c Person.c
Run Code Online (Sandbox Code Playgroud)

两者都必须给予文件,因为某些符号在Person.c被使用Main.c

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

  • @Shiro `gcc Main.c Person.c -o Main` (3认同)