如何在C中包含辅助函数?

时间:2015-12-06 17:52:56

标签: c

共有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'

这种结构是否正确?

2 个答案:

答案 0 :(得分:4)

是的,只要file.c包含

#include "helper.h"

在构建程序时,您将helper.ofile.o链接在一起。

您还需要确保使用-c编译每个文件,以便编译器只编译(而不是链接);稍后使用所有目标文件进行链接。

这里有一个工作示例(我实际上并不需要main.h,但如果你有其中一个,#include来自main.c):

的main.c

#include <stdio.h>
#include <stdlib.h>
#include "helper.h"

int
main (int argc, char **argv)
{
  test ();
  exit (0);
}

helper.c

#include <stdio.h>

void
test ()
{
  printf ("Hello world\n");
}

helper.h

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

在Makefile中

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 首先吗?