Makefile包含头文件

20

我是Linux编程的新手,我尝试编译一个简单的测试程序。但在编译时出现了错误。将inc.c添加到文件中(在app:行中)也不起作用。如何正确地包含这个文件?

Makefile:

app: main.c inc.h
    cc -o app main.c

终端:

make
cc -o app main.c
/tmp/ccGgdRNy.o: In function `main':
main.c:(.text+0x14): undefined reference to `test'
collect2: error: ld returned 1 exit status
make: *** [app] Error 1

main.c:

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

int main()
{
    printf("Kijken of deze **** werkt:\n");
    test();

    getchar();
    return 0;
}

inc.h

#ifndef INCLUDE_H

#define INCLUDE_H

void test();

#endif

inc.c

#include <stdio.h>

void test()
{
    printf("Blijkbaar wel!");
}
3个回答

13

您必须链接到编译单元 inc.o ,该单元是通过编译 inc.c 而获取的。

一般来说,这意味着您必须提供包含在 main.c 中使用的函数的所有对象文件(传递依赖项)。您可以使用 make 的隐式规则编译它们,无需指定额外的规则。

您可以这样说:

app: main.c inc.o inc.h
    cc -o app inc.o main.c

make 会自动知道如何从 inc.c 编译出 inc.o,尽管在确定是否需要重新构建 inc.o 时,它不会考虑 inc.h。如果想要这样做,您需要指定自己的规则。


4

您没有编译inc.c文件。

app: main.c inc.h
    cc -o app main.c inc.c

3

您需要同时编译inc.c。一种适合大型应用的可扩展方法是将Makefile拆分为不同的目标。思路是:每个目标对应一个对象文件,然后再一个目标对应最终二进制文件。编译对象文件时,请使用-c参数。

app: main.o inc.o
    cc -o app main.o inc.o

main.o: main.c inc.h
    cc -c main.c

inc.o: inc.c inc.h
    cc -c inc.c

2
为什么在cc -c main.c inc.hcc -c inc.c inc.h中要放置头文件? - btwiuse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接