Подтвердить что ты не робот

Makefile для компиляции нескольких программ c?

Непростительно простой вопрос, но я новичок в make файлах и пытаюсь сделать make файл, который скомпилирует две независимые программы. Все примеры онлайн идут в путь более подробно, чем мне нужно, и сбивают с толку!

У меня есть следующее:

program1:
    gcc -o prog1 program1.c

program2
    gcc -o prog2 program2.c

Все, что я действительно хочу, это запустить две линии gcc. Что я делаю неправильно?

4b9b3361

Ответ 1

Сделайте это так

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

Ответ 2

############################################################################
# '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,[email protected])
ifeq ($(PRG_SUFFIX_FLAG),0)
        BIN = $(patsubst %$(PRG_SUFFIX),%,[email protected])
else
        BIN = [email protected]
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

Ответ 3

all: program1 program2

program1:
    gcc -Wall -o prog1 program1.c

program2:
    gcc -Wall -o prog2 program2.c

Ответ 4

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

objects = program1 program2
all: $(objects)

$(objects): %: %.c
        $(CC) $(CFLAGS) -o [email protected] $<

Ответ 5

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

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

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

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

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

Ответ 6

all: program1 program2

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

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

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

Ответ 7

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 будут использовать их.