web-dev-qa-db-ja.com

複数のCプログラムをコンパイルするためのMakefile?

これは信じられないほど単純な質問ですが、私はmakefileが初めてです。 2つの独立したプログラムをコンパイルするメイクファイルを作成しようとしています。

program1:
    gcc -o prog1 program1.c

program2:
    gcc -o prog2 program2.c

オンラインのすべての例は、私が必要とするよりも詳細になっており、混乱しています! 2つのgcc行を実行するだけです。何が間違っていますか?

53
Sarah

そうする

all: program1 program2

program1: program1.c
    gcc -o program1 program1.c

program2: program2.c
    gcc -o program2 program2.c

高度なものは必要ないと言いましたが、デフォルトのルールに基づいてこのように短縮することもできます。

all: program1 program2

program1: program1.c
program2: program2.c
60
cnicutar
############################################################################
# 'A Generic Makefile for Building Multiple main() Targets in $PWD'
# Author:  Robert A. Nader (2012)
# Email: naderra at some g
# Web: xiberix
############################################################################
#  The purpose of this makefile is to compile to executable all C source
#  files in CWD, where each .c file has a main() function, and each object
#  links with a common LDFLAG.
#
#  This makefile should suffice for simple projects that require building
#  similar executable targets.  For example, if your CWD build requires
#  exclusively this pattern:
#
#  cc -c $(CFLAGS) main_01.c
#  cc main_01.o $(LDFLAGS) -o main_01
#
#  cc -c $(CFLAGS) main_2..c
#  cc main_02.o $(LDFLAGS) -o main_02
#
#  etc, ... a common case when compiling the programs of some chapter,
#  then you may be interested in using this makefile.
#
#  What YOU do:
#
#  Set PRG_SUFFIX_FLAG below to either 0 or 1 to enable or disable
#  the generation of a .exe suffix on executables
#
#  Set CFLAGS and LDFLAGS according to your needs.
#
#  What this makefile does automagically:
#
#  Sets SRC to a list of *.c files in PWD using wildcard.
#  Sets PRGS BINS and OBJS using pattern substitution.
#  Compiles each individual .c to .o object file.
#  Links each individual .o to its corresponding executable.
#
###########################################################################
#
PRG_SUFFIX_FLAG := 0
#
LDFLAGS := 
CFLAGS_INC := 
CFLAGS := -g -Wall $(CFLAGS_INC)
#
## ==================- NOTHING TO CHANGE BELOW THIS LINE ===================
##
SRCS := $(wildcard *.c)
PRGS := $(patsubst %.c,%,$(SRCS))
PRG_SUFFIX=.exe
BINS := $(patsubst %,%$(PRG_SUFFIX),$(PRGS))
## OBJS are automagically compiled by make.
OBJS := $(patsubst %,%.o,$(PRGS))
##
all : $(BINS)
##
## For clarity sake we make use of:
.SECONDEXPANSION:
OBJ = $(patsubst %$(PRG_SUFFIX),%.o,$@)
ifeq ($(PRG_SUFFIX_FLAG),0)
        BIN = $(patsubst %$(PRG_SUFFIX),%,$@)
else
        BIN = $@
endif
## Compile the executables
%$(PRG_SUFFIX) : $(OBJS)
    $(CC) $(OBJ)  $(LDFLAGS) -o $(BIN)
##
## $(OBJS) should be automagically removed right after linking.
##
veryclean:
ifeq ($(PRG_SUFFIX_FLAG),0)
    $(RM) $(PRGS)
else
    $(RM) $(BINS)
endif
##
rebuild: veryclean all
##
## eof Generic_Multi_Main_PWD.makefile
21
Robert

パターンルール 次のようにmakeを使用して、同じコンパイルコマンドを必要とする複数のcファイルをコンパイルできます。

objects = program1 program2
all: $(objects)

$(objects): %: %.c
        $(CC) $(CFLAGS) -o $@ $<
19
hmofrad
all: program1 program2

program1:
    gcc -Wall -o prog1 program1.c

program2:
    gcc -Wall -o prog2 program2.c
10
Erik
all: program1 program2

program1:
    gcc -Wall -ansi -pedantic -o prog1 program1.c

program2:
    gcc -Wall -ansi -pedantic -o prog2 program2.c

私はむしろ、あなたのプログラムをより良くコントロールするための、ANSIとペダンティックです。まだ警告がある間はコンパイルできません!!

1
Master C

単純なプログラムのコンパイルワークフローは簡単で、小さなグラフとして描画できます。ソース-> [コンパイル]->オブジェクト[リンク]->実行可能ファイル。このグラフにはfiles(ソース、オブジェクト、実行可能ファイル)、およびrulesmakeの用語)。そのグラフは、Makefileで定義されています。

Makeを起動すると、Makefileが読み取られ、変更されたfilesがチェックされます。存在する場合、ruleをトリガーしますが、これはそれに依存します。 ruleは、さらにfilesを生成/更新し、他のrulesなど。適切なメイクファイルを作成すると、必要なrules(コンパイラ/リンクコマンド)のみが実行されます。依存パス。

例を選んでMakefile、構文のマニュアルを読んで(とにかく、一目でわかる、マニュアルなし)、そして描画するグラフ。結果ファイルの名前を見つけるには、コンパイラオプションを理解する必要があります。

Makeグラフは、必要なだけ複雑にする必要があります。無限ループを行うこともできます(しないでください)! make、どのルールがあなたのtargetであるかを知ることができます。左側のfilesはトリガーとして使用されます。

再び:グラフを描く !!.

1
ern0
SRC = a.cpp b.cpp
BIN = $(patsubst %.cpp,%,$(SRC))

all: $(BIN)

clean:
    rm -f $(BIN)

.PHONY: all clean

make all しましょう:

c++     a.cpp   -o a
c++     b.cpp   -o b

CXXおよびCXXFLAGS変数を設定すると、makeはそれらを使用します。

0