在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.c
和Person.c
时,您只编译Main.c
尝试将其编译为gcc Main.c Person.c -o MyProgram
。
每当有多个文件时,都需要在编译时指定它们以便解析外部引用,就像这里的情况一样。 编译器将吐出稍后将链接到可执行文件的目标文件。 查看关于makefile的本教程: Make File Tutorial它有助于自动执行此过程。