【问题标题】:In C programming, what is `undefined reference`error, when compiling? [duplicate]在 C 编程中,编译时出现“未定义引用”错误是什么? [复制]
【发布时间】:2015-07-11 23:18:01
【问题描述】:

我有下面这个简单的程序,我想在 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进行编译。

【问题讨论】:

  • @Satya 呃,为什么?我有一个Person.c 和一个Person.h 那有什么问题?
  • gcc 两个 .c 文件一起

标签: c undefined-reference


【解决方案1】:

当您链接程序时,您需要同时提供 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

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

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

【讨论】:

  • 你能给我正确的编译方法吗?现在我正在使用gcc Main.c -o Main
  • @Shiro gcc Main.c Person.c -o Main
  • 所以我必须在该单个命令中实际提及每个 .c 文件?不知道这个,谢谢
【解决方案2】:

问题的出现可能是因为您只编译了Main.c,而您需要同时编译Main.c 和Person.c。尝试编译为gcc Main.c Person.c -o MyProgram。

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

【讨论】:

    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多