0

我有一个名为 UnitTest 的文件夹。我有几个 .c 文件。所有文件都包含函数'main'。

使用makefile,我想一起编译该文件夹的所有.c 文件。但是这些文件依赖于不同文件夹中的其他 C 文件。

我该如何为此编写make文件?

例如。Common\*.c - 生成目标文件 App\*.c - 生成目标文件。- 指公共目录 UnitTest\ .c 的 .o 文件 - 这些文件应编译为可执行文件。参考目录 App 和 Common 中的 *.o。

更新:头文件位于名为 \Include 的单独目录中

为此,我需要一个 makefile。请帮忙。

4

2 回答 2

2

根据标准,每个目录都将包含一个 Makefile。因此,如果您有三个目录,那么您可以为这项工作完成三个 Makefile。

(d) common
 |
 |---(f) common.h
 |---(f) common.c
 |---(f) Makefile --- MAkefile for the common folder.

(d) app
 |
 |---(f) app.h
 |---(f) app.c
 |---(f) Makefile

(d) unittest
 |
 |---(f) unittest.h
 |---(f) unittest.c
 |---(f) Makefile

(f) Makefile --- invoke all makefiles in the mentioned order. 

如果您希望一个 Makefile 完成所有这些操作,您也可以这样做。在这里,您必须通过提供文件的路径来编译文件。秩序是最无能为力的。

于 2013-07-24T13:16:08.527 回答
1

这很复杂,所以我们将分阶段进行。首先,构建目标文件:

CFLAGS += -I/include

vpath %.h /include

这应该足以在或Common/中构建任何目标文件。在继续之前测试一下。Apps/UnitTest/

现在构建所有对象Common/

COMMONSOURCES := $(wildcard Common/*.c)
COMMONOBJECTS := $(COMMONSOURCES:.c=.o)

all: $(COMMONOBJECTS)

在继续之前测试一下。

删除该all规则,并为公共库添加一个规则。(我们现在将使用静态库,因为它更简单一些。)

Common/libCommon.a: $(COMMONOBJECTS)
    ar -cvq $@ $^

测试那么多,在评论中告诉我们它是如何工作的,然后我们将构建Apps库和UnitTest可执行文件。

于 2013-07-24T13:19:32.587 回答