2013-03-15 62 views
0

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

/* file: compile_only_these.c*/ 

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

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

你能提出一个更好的方法来编译这些文件。

更多信息:

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

您的方法很奇怪,而且没有在生产代码中看到过 – Vorsprung 2013-03-15 20:05:53

+0

@Vorsprung:我同意。这就是为什么我打算改变这种方法。顺便说一句,这不是我设计的。 – 2013-03-15 20:09:16

回答

0

你需要的是在Makefile的变量,需要目标文件的列表,像这样:

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

您可以制作从compile_only_these.c文件这样的构造它:

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

你还需要一只手与使用这些对象,构成最终产品的规则?

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 [email protected] $^ $(LDFLAGS) 


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

你显然需要如果您希望在制作过程中执行更多操作,而不仅仅是编译此文件列表,请调整构建层次结构细节的路径,但是这是一种通用方法,用于通过通配符替换来获取所有文件。

+0

我的问题不在于如何编译多个文件。我想编译选择性的.c文件。你能解释一下你的解决方案如何帮助编译所需文件而不是所有文件。 – 2013-03-15 21:20:24

+0

对不起,我最初误解了这个问题。如果“额外”文件的唯一目的是为了防止它们在稍后需要,并且您不想将它们移动到新文件夹以反映出来,则可以a)在SRCS中保留一个洗衣清单上面显示的变量,并在添加/删除文件名时保持该状态。 b)将“extra”.c文件重命名为filename.c.saved(或者选择一个命名约定),以防止它们被make拾起。 b)选项将使得从构建中添加/删除文件不会比重命名更复杂。 – 2013-03-15 21:24:14