[英]Makefile to build multiple programs with Main in C
我的目标是创建一个可以同时构建9个程序的makefile。 例如 Program1.c,Program2.c ... Program9.c。
一旦运行make,我希望能够键入./ProgramN(N是任何程序1-9)来运行任何特定程序。
所有程序共享用于函数原型和结构定义的相同头文件,称为program.h。 同样,这9个程序使用的所有功能都将保存在一个名为program.c的文件中。
谁能给我一个有关如何执行此操作的线索?
您只需要一个带有9个目标的make-每个完全链接的可执行文件一个,每个目标都有两个组件ProgramN.c和programs.c,其中program.c和ProgramN.c都有一个依赖程序。
类似于以下内容(您需要完成...
省略的部分-并测试构建环境和工具链的宏):
# 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
制作者都建立起伪目标all
这样做,找到每个依存性,每个链接ProgramN.o和programs.o的规则。 这些.o文件不存在,因此mak找到了生成.o文件的规则,存在将.c转换为.o的通用规则,因此可以使用。
您需要的实际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.c
构建foo.o
但是,如果要让Make跟踪何时必须重建文件,则必须告诉它们这些对象所依赖的文件。 因此,即使未在目标文件中指定命令,也必须为其指定规则:
programs.o: programs.h
Program1.o: programs.h
Program1: Program1.o programs.o
$(CC) Program1.o programs.o -o Program1
您可以使用自动变量使最后一条规则更简洁:
Program1: Program1.o programs.o
$(CC) $^ -o $@
您可以编写模式规则 ,而不是为每个程序1-9编写至少两个版本的版本:
Program%.o: programs.h
Program%: Program%.o programs.o
$(CC) $^ -o $@
然后再添加一个需要所有程序的规则(在顶部,这是默认规则):
all: Program1 Program2 ...
使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.