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

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

Main.c

 #include  #include "Person.h" int main() { struct Person1 p1 = Person1_Constructor(10, 1000); } 

Person.c

 #include  #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来编译。

链接程序时,需要将Main.o和Person.o作为输入。

构建通常分两步完成(1)编译和(2)链接。 编译你的来源做:

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

或者在一行中:

 $ gcc -c Main.c Person.c 

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

 $ gcc -o Main Main.o Person.o 

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

 $ gcc -o Main Main.c Person.c 

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

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

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

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