Скомпилируйте все исходные файлы в исполняемые файлы

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

Поскольку я всегда пишу много тестовых файлов, мне нужно вводить кучу флагов каждый раз, когда я их компилирую, это так хлопотно. Я просто хочу написать make-файл, который компилирует все исходные файлы в исполняемые файлы с соответствующими именами — например, a.c в a и b.c в b и т. д., чтобы я мог получить исполняемые файлы, просто набрав make вместо всего gcc...

Есть ли простой способ сделать это?


person Xufeng    schedule 23.02.2014    source источник
comment
Изучайте скриптинг. Это действительно просто и выгодно. Я могу показать тебе свою, если хочешь. Я создал make-файл, который постоянно компилируется.   -  person KRUKUSA    schedule 23.02.2014
comment
@KRUKUSA Да, я скоро научусь писать сценарии, но пока я изучаю C и все еще очень новичок. Так что мне это нужно для повышения эффективности :). Было бы здорово, если бы вы могли поделиться своим.   -  person Xufeng    schedule 23.02.2014


Ответы (3)


Make имеет встроенное неявное правило, подобное этому:

  % : %.c
         $(CC) -o $@ $(CFLAGS) $<

$(CFLAGS) будет содержать все ваши параметры.

Затем, делая

make foo

Попытался бы создать foo из foo.c (если бы он существовал).

Чтобы иметь возможность скомпилировать их все за один раз, добавьте еще одно правило:

all: $(patsubst %.c,%,$(wildcard *.c))

Это новое правило, называемое «все», требует наличия списка ваших исполняемых файлов. Функция wildcard перечисляет все файлы .c в каталоге, а patsubst удаляет .c из каждого из них, оставляя список исполняемых файлов, которые будут созданы из каждого файла .c.

Так делаю

make all

заставляет его пытаться скомпилировать каждый файл .c в соответствующий исполняемый файл.

person harmic    schedule 23.02.2014
comment
Я понимаю большую часть этого, но запутался в предпосылках всего. Что делает patsubst? Разве * уже не подразумевает подстановочный знак? Зачем вам нужно добавлять «подстановочный знак» перед ним? - person Xufeng; 23.02.2014
comment
@Xufeng Хорошо, отредактировал, чтобы объяснить это немного лучше - person harmic; 23.02.2014

Ладно понял. Я не слишком уверен, поймете ли вы синтаксис. Я постараюсь объяснить как можно больше.

вы создадите файл с именем Makefile без расширений.

DIR=$(HOME)/../"Your directory"

all: "Whatever driver you may have"

purify: purify g++ -o "Your file" -Wall -pedantic -g "objective file .o extension"

# Makes clean file
clean:
        rm -f *.o  "Drivers"

new:
    make clean
    make
person KRUKUSA    schedule 23.02.2014
comment
что делает очистка? зачем вам это перед именем компилятора? Кроме того, нужно ли явно заменять Ваш файл именем выходного файла, который я хочу? Я хочу, чтобы make-файл автоматически генерировал свое имя. - person Xufeng; 23.02.2014
comment
Да. Очистите проверки на утечку памяти, если вы хотите запустить valgrind - person KRUKUSA; 23.02.2014
comment
Это имеет все виды проблем. Я бы не стал использовать это как пример. - person MadScientist; 23.02.2014

make встроил для этого неявные правила. Просто введите make a или make b или make a b или что хотите. Добавьте и экспортируйте переменную среды с именем CFLAGS, если вы хотите добавить какие-либо специальные параметры.

person Carl Norum    schedule 23.02.2014