C Makefile编译一些选择性文件

时间:2013-03-15 20:02:36

标签: c makefile

我正在开发一个包含大约200个.c文件和一些.h文件的C项目。并非最终产品中都需要这200个文件。目前大约需要编译180个文件。我们有一个文件“compile_only_these.c”,其中包含项目所需的180 * .c文件。我们的makefile只编译这个文件而不是单独的.c文件。

/* file: compile_only_these.c*/

#include "file1.c"
#include "file2.c"
.
.
.
#include "file180.c"

但我认为包含.c文件是一个坏主意。因为每次我修改这些文件时,都会再次编译所有文件。

您能否建议更好的方法来编译这些文件。

更多信息:

  • 所有.c文件都在同一个文件夹“../ project / src”
  • 我不断添加需要编译的新.c文件。我不想每次添加新文件时修改Makefile。
  • 我仍然希望保留那些我现在没有编译的20个.c文件。我将来可能会用它。删除这些文件正在将它们移动到其他目录不是解决方案

2 个答案:

答案 0 :(得分:0)

你需要的是makefile中的一个变量,一个必需的目标文件列表,如下所示:

OBJS := file1.o file2.o ... file180.o

您可以从compile_only_these.c文件中构建Make,如下所示:

OBJS := $(shell sed -e '/\#include/!d' -e 's/\#include "\(.*\)\.c"/\1.o/' compile_only_these.c)

您是否还需要掌握使用这些对象构建最终产品的规则?

答案 1 :(得分:0)

正如已经提到的,这是一种管理项目的奇怪方式,但考虑到你必须使用的东西,你可以尝试一下这种方法......

CC = gcc
OBJFILE = myprog

# Tweak to match whatever you compile with normally
CFLAGS  = -O2 -Wall -std=c89 -pedantic
LDFLAGS= # Extra flags here, for example -lm -pthread 

RM = rm -f

SRCS = $(wildcard *.c)
OBJS = $(SRCS:.c=.o)

$(OBJFILE):$(OBJS)
    $(CC) -o $@ $^ $(LDFLAGS)


clean:
    $(RM) core *~ $(OBJS) $(OBJFILE)

如果你想在make中做更多的事情而不仅仅是编译这个文件列表,你显然需要调整你的构建层次结构细节的路径,但这是一个用通配符获取所有文件的一般方法取代