Makefile / скрипт для небольшой программы - PullRequest
0 голосов
/ 07 августа 2009

Мне часто приходится компилировать небольшие программы и запускать их. Поскольку каждый раз для каждого файла cpp было утомительно писать команду компиляции g++ -W -Wall file.cpp -o out, я написал один маленький скрипт, который выполняет компиляцию.

Вот сценарий, который я написал

#!/bin/bash
g++ -W -Wall $1 -o $1.out

Итак, если мне нужно скомпилировать файл file.cpp, я сделаю compile file.cpp , и он создаст для меня file.cpp.out исполняемый файл. И такой файл .cpp не имеет никаких заголовочных файлов или любых других зависимостей.

Я знаю, как написать make-файл для определенного файла .cpp вот так (очень простой случай)

file: file.cpp
    g++ -W -Wall file.cpp -o file

но если мне нужно скомпилировать file2.cpp, мне придется снова изменить вышеупомянутый makefile или написать новый. Итак, что я хочу сделать, так это то, что когда я даю команду make file.cpp, она создает файл как исполняемый файл. И когда я даю make file2.cpp, он создает file2 как исполняемый файл, и аналогично для других файлов cpp.

Ответы [ 7 ]

5 голосов
/ 07 августа 2009
export CXXFLAGS="-W -Wall"
rm Makefile
make file1

Make имеет нормальные значения по умолчанию. Вам не нужно писать make-файл, чтобы использовать make.

У Make есть набор общих правил, которые применяются автоматически, когда нет определенного правила. Одним из них является создание файла file из файла file.cpp с использованием компилятора C ++ с флагами переменной среды CXXFLAGS. Это работает немного так, как вы хотите ...

4 голосов
/ 07 августа 2009

Вы можете иметь следующую цель

.cpp:
        g++ -W -Wall $@.cpp -o $@

Это создает неявное правило, которое означает, что для создания файла с именем x, где файл x.cpp уже существует, выполните следующую операцию.

Если у вас есть правило, вы можете просто сделать это из командной строки:

make file
make file2
3 голосов
/ 07 августа 2009

В зависимости от правил make по умолчанию для C ++, make-файлу требуется только

CPPFLAGS ?= -W -Wall

Затем в командной строке:

make file1
make file2
rm file2
make file2 CPPFLAGS="-W -Wall -O3"
rm file2
make file2 CXXFLAGS="-O3"   # possibly a bit too cunning, this one
                            # It has the same effect as the one with CPPFLAGS

Лично я бы добавил в makefile

EXECUTABLES = file1 file2

all: $(EXECUTABLES)

clean: 
    rm -f $(EXECUTABLES)
1 голос
/ 07 августа 2009

Просто создайте Makefile со следующей строкой

CXXFLAGS=-W -Wall

Теперь вы можете позвонить, например,

make foo

и он автоматически ищет файл "foo.cpp".

1 голос
/ 07 августа 2009
%: %.cpp
    g++ -W -Wall $*.cpp -o $*
0 голосов
/ 01 октября 2010

Вы можете запустить make prog # для сборки соответствующей программы.

CXX=/usr/bin/g++
CXXFLAGS=-W -Wall
TARGETS=prog1 prog2 prog3

all: $(TARGETS)

prog1: prog1.cpp
    $(CXX) $(CXXFLAGS) prog1.cpp -o prog1

prog2: prog2.cpp
    $(CXX) $(CXXFLAGS) prog2.cpp -o prog2

prog3: prog3.cpp
    $(CXX) $(CXXFLAGS) prog3.cpp -o prog3
0 голосов
/ 07 августа 2009

A Makefile не собирается работать как скрипт; принимая конкретные входы для генерации конкретных выходов. Вместо этого в нем описаны зависимости между файлами и способы построения любой зависимости для достижения конкретной цели.

Хотя можно сделать то, что вы просите, создав цель с именем "file1" и цель с именем "file2", но это не идея Makefile s; вам лучше использовать сценарий оболочки, если это ваше требование.

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