使用GCC进行编译时出错

时间:2011-08-14 00:45:11

标签: c function gcc reference undefined

每次编译时都会收到以下错误消息:

Undefined reference to ( function name )

假设我有三个文件:Main.cprinthello.hprinthello.cMain.c调用函数print_hello(),返回“Hello World”。该函数在printhello.c

中定义

现在,这是printhello.h的以下代码:

#ifndef PRINTHELLO_H 
#define PRINTHELLO_H

void print_hello();

#endif

我确信这段代码很好。不过,我仍然不知道为什么它会给我错误。你能救我吗?

4 个答案:

答案 0 :(得分:3)

未定义的引用是链接器错误。您是否正在编译和链接所有源文件?由于main.c调用print_hello(),链接器应该看到它的定义。

gcc Main.c printhello.c -o a.out

答案 1 :(得分:3)

我认为错误是链接器错误而不是编译器错误;它试图告诉你,你没有提供制作完整程序所需的所有功能。

你需要像这样编译程序:

gcc -o printhello Main.c printhello.c

这假定您的文件Main.c类似于:

#include "printhello.h"

int main(void)
{
    print_hello();
    return 0;
}

并且您的文件printhello.c类似于:

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

void print_hello(void)
{
    puts("Hello World");
}

您在printhello.h的声明应该是:

void print_hello(void);

这明确表示该函数不带参数。带有空括号的声明意味着“有一个函数print_hello()不返回任何值,并且采用不确定(但不是可变参数)的参数列表”,这是完全不同的。特别是,您可以使用任意数量的参数调用print_hello(),并且编译器无法拒绝该程序。

请注意,C ++将空参数列表视为与void print_hello(void);相同(因此它将确保对print_hello()的调用不包含参数),但C ++与C不同。

答案 2 :(得分:0)

另一种方法是显式构建printhello的目标文件:

gcc -c printhello.c -o printhello.o
gcc -o Main main.c printhello.o

这允许其他程序使用print_hello方法

答案 3 :(得分:0)

似乎错误来自链接器而不是编译器。您需要编译并链接两个源文件。我认为您正在做的只是在Main.c中包含头文件而您没有编译printhello.c

你需要:

gcc Main.c printhello.c -o myprog

首先构建目标文件

gcc -c printhello.c
gcc -c Main.c

然后链接他们

gcc Main.o printhello.o