我的目标是创建一个可以同时构建9个程序的makefile。例如Program1.c,Program2.c ... Program9.c。
一旦我运行make,我希望能够键入./ProgramN(N是1-9的任何程序)来运行任何特定程序。
所有程序共享用于函数原型和结构定义的相同头文件,称为program.h。另外,这9个程序使用的所有功能都将保存在一个名为“ programs.c”的文件中。
任何人都可以给我一个有关如何执行此操作的线索吗?
答案 0 :(得分:2)
您只需要一个带有9个目标的make-每个完全链接的可执行文件一个,每个目标都有两个组件ProgramN.c和programs.c,其中program.c和ProgramN.c都有一个依赖程序。h。
类似于以下内容(您需要完成...
省略的部分-并测试构建环境和工具链的宏):
# Compiler, Linker Defines
CC = /usr/bin/gcc
CFLAGS = -Wall
.PHONY: all
# All targets rule
all : Program1 Program2 ... Program9
# Individual Program rules
Program1 : Program1.o programs.o
$(CC) -o $@ $^
Program2 : Program2.o programs.o
$(CC) -o $@ $^
...
Program9 : Program9.o programs.o
$(CC) -o $@ $^
# Source file rules
Program1.c : programs.h
Program2.c : programs.h
...
Program9.c : programs.h
programs.c : programs.h
# Compile rule, (.c to .o)
%.o: %.c
$(CC) -c $(CFLAGS) $*.c
Make必须构建伪目标all
,以便为每个依赖项找到一条规则,每个依赖项都链接ProgramN.o和programs.o。这些.o文件不存在,因此mak找到了生成.o文件的规则,存在将.c转换为.o的通用规则。
答案 1 :(得分:1)
您需要的实际makefile非常小:
all: Program1 Program2 Program3 Program4 Program5 Program6 Program7 Program8 Program9
Program%: Program%.o programs.o
$(CC) $^ -o $@
Program%.o: programs.h
programs.o: programs.h
完成!要了解其工作原理,您必须先使用用于生成这些可执行文件的命令而无需 Make:
cc programs.c -c -o programs.o
cc Program1.c -c -o Program1.o
cc Program1.o programs.o -o Program1
(假设您使用cc作为编译器。)在单独的步骤中构建目标文件(而不只是cc programs.c Program1.c -o Program1
)是有意义的,因为您可以将programs.o
与所有可执行文件一起使用1 -9。
要像makefile那样写那么多的文件,只需要一个规则,而不是三个规则,因为Make已经知道如何从foo.o
构建foo.c
。但是,如果要让Make跟踪何时必须重建文件,则必须告诉它们这些对象所依赖的文件。因此,即使您未在目标文件中指定命令,也必须为其指定规则:
programs.o: programs.h
Program1.o: programs.h
Program1: Program1.o programs.o
$(CC) Program1.o programs.o -o Program1
您可以使用automatic variables使最后一条规则更简洁:
Program1: Program1.o programs.o
$(CC) $^ -o $@
您可以编写pattern rules而不是为每个程序1-9编写至少两个版本的版本:
Program%.o: programs.h
Program%: Program%.o programs.o
$(CC) $^ -o $@
然后只添加一个需要所有程序的规则(在顶部,这是默认规则):
all: Program1 Program2 ...
答案 2 :(得分:0)
使用gmake
[GNU make],通过二次扩展,make实际上可以相当紧凑:
# mktgt/Makefile -- make file for mktgt
#
# SO: makefile to build multiple programs with main in c
# SITE: stackoverflow.com
# SO: 51387854
CFLAGS += -Wall
CFLAGS += -O2
ALL += Program1
ALL += Program2
###ALL += Program3
###ALL += Program4
###ALL += Program5
###ALL += Program6
###ALL += Program7
###ALL += Program8
###ALL += Program9
OLIST += programs.o
HDEP += programs.h
SRC = $(addsuffix,.c,$(ALL))
OBJ = $(addsuffix,.o,$(ALL))
all: $(ALL)
%.o: %.c $(HDEP)
cc $(CFLAGS) -c $<
.SECONDEXPANSION:
$(ALL):: $$@.o $(OLIST)
cc $(CFLAGS) -o $@ $^
clean:
rm -f *.o $(ALL)