我正在开发一个包含大约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文件是一个坏主意。因为每次我修改这些文件时,都会再次编译所有文件。
您能否建议更好的方法来编译这些文件。
更多信息:
答案 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中做更多的事情而不仅仅是编译这个文件列表,你显然需要调整你的构建层次结构细节的路径,但这是一个用通配符获取所有文件的一般方法取代