共有4个文件:
helper.h //contains the signatures of functions in helper.c
helper.c //implements the signatures in helper.h
file.h //has all the includes needed to run file.h
file.c //this file includes file.h and helper.h
在file.c中,我需要使用main函数中helper.c中定义的函数。但是,file.c表示存在undefined reference to 'func_found_in_helper.c'
这种结构是否正确?
答案 0 :(得分:4)
是的,只要file.c
包含
#include "helper.h"
在构建程序时,您将helper.o
和file.o
链接在一起。
您还需要确保使用-c
编译每个文件,以便编译器只编译(而不是链接);稍后使用所有目标文件进行链接。
这里有一个工作示例(我实际上并不需要main.h
,但如果你有其中一个,#include
来自main.c
):
#include <stdio.h>
#include <stdlib.h>
#include "helper.h"
int
main (int argc, char **argv)
{
test ();
exit (0);
}
#include <stdio.h>
void
test ()
{
printf ("Hello world\n");
}
void test ();
gcc -Wall -Werror -c -o main.o main.c
gcc -Wall -Werror -c -o helper.o helper.c
gcc -Wall -Werror -o test main.o helper.o
test: main.o helper.o
gcc -Wall -Werror -o test main.o helper.o
%.o: %.c
gcc -c -Wall -Werror -o $@ $<
clean:
rm -f *.o test
$ ./test
Hello world
如果没有该程序,有什么其他可能错误的说法有点困难;我的猜测是,您忘记了-c
的{{1}}标记,或忘记链接gcc
。
答案 1 :(得分:1)
对'func_found_in_helper.c'的未定义引用
这有点奇怪,因为它表明你试图使用'.c'扩展名调用该函数,而不是只是函数名称。也许是'。'问题只是一个错字?
链接器也会标记一个未定义的符号,所以也可能是你没有告诉链接器在哪里找到helper.o(编译成目标文件的helper.c文件)。编译器将自动启动链接器。你编译helper.c 首先吗?