每次编译时都会收到以下错误消息:
Undefined reference to ( function name )
假设我有三个文件:Main.c
,printhello.h
,printhello.c
。 Main.c
调用函数print_hello()
,返回“Hello World”。该函数在printhello.c
。
现在,这是printhello.h的以下代码:
#ifndef PRINTHELLO_H
#define PRINTHELLO_H
void print_hello();
#endif
我确信这段代码很好。不过,我仍然不知道为什么它会给我错误。你能救我吗?
答案 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