Makefile для компиляции нескольких программ на C? - PullRequest
52 голосов
/ 10 мая 2011

Это невероятно простой вопрос, но я новичок в makefiles. Я пытаюсь создать make-файл, который скомпилирует две независимые программы:

program1:
    gcc -o prog1 program1.c

program2:
    gcc -o prog2 program2.c

Все примеры в Интернете приводят больше деталей, чем мне нужно, и сбивают с толку! Все, чего я действительно хочу, это запустить две gcc строки. Что я делаю не так?

Ответы [ 7 ]

59 голосов
/ 10 мая 2011

Сделай так

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
21 голосов
/ 04 декабря 2012
############################################################################
# '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
18 голосов
/ 12 апреля 2017

Шаблонные правила позволяют компилировать несколько файлов c, для которых требуются одинаковые команды компиляции, используя make следующим образом:

objects = program1 program2
all: $(objects)

$(objects): %: %.c
        $(CC) $(CFLAGS) -o $@ $<
10 голосов
/ 10 мая 2011
all: program1 program2

program1:
    gcc -Wall -o prog1 program1.c

program2:
    gcc -Wall -o prog2 program2.c
1 голос
/ 10 мая 2011

Простой рабочий процесс компиляции программы прост, я могу нарисовать его в виде небольшого графика: source -> [compilation] -> object [linking] -> исполняемый файл.В этом графе есть файлы (источник, объект, исполняемый файл) и правила (терминология make ).Этот график определен в Makefile .

Когда вы запускаете make, он читает Makefile и проверяет наличие файлов .Если он есть, он запускает правило , которое зависит от него. правило может создавать / обновлять файлы , которые могут запускать другие правила и так далее.Если вы создадите хороший make-файл, будут запущены только необходимые правила (команды компилятора / ссылки), что означает «следующий» из измененного файла в пути зависимости.

Выберите пример Makefile , прочитайте руководство по синтаксису (в любом случае, это понятно на первый взгляд, без руководства), и нарисуйте график .Вы должны понимать параметры компилятора, чтобы узнать имена файлов результатов.

Граф make должен быть настолько сложным, насколько вы хотите.Вы можете даже сделать бесконечные циклы (не делайте)!Вы можете сказать make , какое правило является вашей target , поэтому в качестве триггеров будут использоваться только левые файлы .

Снова: Нарисуйте график !.

0 голосов
/ 25 октября 2016
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 голосов
/ 10 мая 2011
all: program1 program2

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

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

Я скорее ANSI и педантичный, лучший контроль для вашей программы. Это не позволит вам скомпилировать, пока у вас есть предупреждения !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...