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