繁体   English   中英

Makefile使用Main in C构建多个程序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM