我有一个名为UnitTest的文件夹。我有几个.c文件。所有文件都包含'main'函数。
使用makefile,我想一起编译该文件夹的所有.c文件。 但是这些文件依赖于不同文件夹中的其他C文件。
如何为此编写make文件?
例如。 Common \ * .c - 生成目标文件 App \ * .c - 生成目标文件。 - 引用Common目录的 .o文件 UnitTest \ .c - 这些文件应编译为可执行文件。请参阅App和Common目录中的* .o。
更新: 头文件位于名为\ Include
的单独目录中我需要一个makefile。请帮忙。
答案 0 :(得分: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,您也可以这样做。在这里,您必须通过提供文件的路径来编译文件。订单最无能为力。
答案 1 :(得分:1)
这很复杂,所以我们将分阶段进行。首先,构建目标文件:
CFLAGS += -I/include
vpath %.h /include
这应足以在Common/
,Apps/
或UnitTest/
中构建任何对象文件。 在继续前进行测试。
现在在Common/
中构建所有对象:
COMMONSOURCES := $(wildcard Common/*.c)
COMMONOBJECTS := $(COMMONSOURCES:.c=.o)
all: $(COMMONOBJECTS)
在继续之前测试一下。
删除all
规则,并为Common库添加规则。 (我们现在将使用静态库,因为它有点简单。)
Common/libCommon.a: $(COMMONOBJECTS)
ar -cvq $@ $^
测试那么多,在评论中告诉我们它是如何工作的,然后我们将构建Apps
库和UnitTest
可执行文件。