2013-07-24 81 views
0

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

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

如何为此编写make文件?

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

更新: 头文件是在一个名为单独目录\包含

我需要为这个单一的生成文件。请帮忙。

+0

你使用头文件吗?他们在哪? – Beta

+0

@Beta,Header文件位于\ Include – SHRI

+0

的单独目录中,并且对于'UnitTest /'中的每个文件,你知道它需要'Common /'和'Apps /'中的哪些文件吗? – Beta

回答

2

按照标准,每个目录将包含一个Makefile。所以如果你有三个目录,你可以完成三个Makefiles。

(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

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

CFLAGS += -I/include 

vpath %.h /include 

这应该是足以建立任何目标文件中Common/Apps/UnitTest/继续前进行测试。在继续之前

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

all: $(COMMONOBJECTS) 

测试此:

我们建立的所有对象的Common/

删除该all规则,并放入公用库的规则。 (我们将使用一个静态库现在,因为它是一个简单一点。)

Common/libCommon.a: $(COMMONOBJECTS) 
    ar -cvq [email protected] $^ 

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