18

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

生成文件:

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

主.c:

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

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

    getchar();
    return 0;
}

英寸

#ifndef INCLUDE_H

#define INCLUDE_H

void test();

#endif

公司

#include <stdio.h>

void test()
{
    printf("Blijkbaar wel!");
}
4

3 回答 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.oinc.c尽管在确定是否必须重建时不会考虑。为此,您必须指定自己的规则。inc.hinc.o

于 2013-03-15T19:00:30.793 回答
4

你没有编译inc.c文件

app: main.c inc.h
    cc -o app main.c inc.c
于 2013-03-15T19:01:12.917 回答
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
于 2013-05-01T11:24:41.290 回答