0

我正在开发一个包含大约 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 文件。我将来可能会使用它。删除这些文件将它们移动到其他目录不是解决方案
4

2 回答 2

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 中做的不仅仅是编译这个文件列表,您显然需要针对构建层次结构的细节调整路径,但这是使用通配符替换获取所有文件的通用方法。

于 2013-03-15T21:10:45.127 回答
0

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

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

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

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

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

于 2013-03-15T20:24:16.037 回答