минимальный c ++ make файл для linux - PullRequest
22 голосов
/ 13 ноября 2008

Я хотел бы найти простой рекомендуемый «минимальный» make-файл c ++ для linux, который будет использовать g ++ для компиляции и связывания одного файла и файла h. В идеале в файле make даже не должно быть физических имен файлов, а имеется только преобразование .cpp в .o. Каков наилучший способ создать такой make-файл, не погружаясь в ужасы autoconf?

Текущий каталог содержит, например,

t.cpp t.h

и я хочу, чтобы для этого был создан make-файл. Я попытался autoconf, но предполагается, что .h это gcc вместо g ++. Да, хотя я и не новичок, я много лет назад изучал лучшие подходы к управлению проектами и, следовательно, ищу автоматизированные способы создания и поддержки make-файлов для небольших проектов.

Ответы [ 11 ]

30 голосов
/ 13 ноября 2008

Если это один файл, вы можете набрать

make t

И это вызовет

g++ t.cpp -o t

Для этого даже не требуется Makefile в каталоге, хотя он запутается, если у вас есть t.cpp, t.c, t.java и т. Д.

Также настоящий Makefile:

SOURCES := t.cpp
# Objs are all the sources, with .cpp replaced by .o
OBJS := $(SOURCES:.cpp=.o)

all: t

# Compile the binary 't' by calling the compiler with cflags, lflags, and any libs (if defined) and the list of objects.
t: $(OBJS)
    $(CC) $(CFLAGS) -o t $(OBJS) $(LFLAGS) $(LIBS)

# Get a .o from a .cpp by calling compiler with cflags and includes (if defined)
.cpp.o:
    $(CC) $(CFLAGS) $(INCLUDES) -c $<
18 голосов
/ 13 ноября 2008

Вот общий make-файл из моего каталога фрагментов кода:

SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
DEPS=$(SOURCES:.cpp=.d)
BINS=$(SOURCES:.cpp=)

CFLAGS+=-MMD
CXXFLAGS+=-MMD

all: $(BINS)

.PHONY: clean

clean:
    $(RM) $(OBJECTS) $(DEPS) $(BINS)

-include $(DEPS)

Пока у вас есть один источник .cpp, производящий один двоичный файл, вам больше ничего не нужно. Я использовал его только с GNU make, а для генерации зависимостей используется синтаксис gcc (также поддерживается icc). Если вы используете компиляторы SUN, вам нужно изменить «-MMD» на «-xMMD». Кроме того, убедитесь, что вкладка в начале строки после clean: не будет заменена пробелами при вставке этого кода, или make выдаст ошибку отсутствующего разделителя.

8 голосов
/ 13 ноября 2008

Вы смотрели на SCons ?

Просто создайте файл SConstruct со следующим:

Program("t.cpp")

Затем введите:

scons

Готово!

5 голосов
/ 13 ноября 2008

При условии отсутствия предварительно настроенных общесистемных make настроек:

CXX = g++
CPPFLAGS =        # put pre-processor settings (-I, -D, etc) here
CXXFLAGS = -Wall  # put compiler settings here
LDFLAGS =         # put linker settings here

test: test.o
    $(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) test.o

.cpp.o:
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<

test.cpp: test.h
2 голосов
/ 31 января 2015

довольно маленький Makefile GNU, использующий предопределенные правила и автодепс

CC=c++
CXXFLAGS=-g -Wall -Wextra -MMD
LDLIBS=-lm
program: program.o sub.o
clean:
    $(RM) *.o *.d program
-include $(wildcard *.d)
1 голос
/ 14 ноября 2008

Вы смотрели на OMake ?

OMakeroot

open build/C
DefineCommandVars()
.SUBDIRS: .

OMakefile

.DEFAULT: $(CXXProgram test, test)

Затем в Linux или Windows просто введите:

omake

В качестве бонуса вы автоматически получаете:

  • параллельные сборки с опцией -j (аналогично make).
  • Контрольные суммы MD5 вместо временных меток (сборка становится устойчивой к сбоям синхронизации времени).
  • Автоматические и точные зависимости заголовка C / C ++.
  • Точные зависимости между каталогами (что не предлагает рекурсивное make).
  • Переносимость (1 цепочка сборки, чтобы управлять ими всеми, невосприимчивы к проблемам стиля пути).
  • Настоящий язык программирования (лучше, чем GNU make).
0 голосов
/ 28 января 2018

Я охотился за тем, как может выглядеть минимальный Makefile, кроме

some_stuff:
    @echo "Hello World"

Я знаю, что опаздываю на эту вечеринку, но я думал, что тоже брошу свою шляпу на ринг. Ниже приведен мой единственный каталог проекта Makefile, который я использовал годами. С небольшой модификацией он масштабируется для использования нескольких каталогов (например, src, obj, bin, header, test и т. Д.). Предполагается, что все заголовки и исходные файлы находятся в текущем каталоге. И, должны дать проекту имя, которое используется для выходного двоичного имени.

NAME = my_project

FILES = $(shell basename -a $$(ls *.cpp) | sed 's/\.cpp//g')
SRC = $(patsubst %, %.cpp, $(FILES))
OBJ = $(patsubst %, %.o, $(FILES))
HDR = $(patsubst %, -include %.h, $(FILES))
CXX = g++ -Wall

%.o : %.cpp
        $(CXX) $(HDR) -c -o $@ $<

build: $(OBJ)
        $(CXX) -o $(NAME) $(OBJ)

clean:
        rm -vf $(NAME) $(OBJ)
0 голосов
/ 14 ноября 2008

флорин имеет хорошую отправную точку. Мне не понравился gnu autoconf, поэтому я начал там, продолжил концепцию и назвал ее MagicMakefile. У меня есть 3 версии этого от простого до более сложного. Последний сейчас на github: https://github.com/jdkoftinoff/magicmake

По сути, он предполагает, что у вас есть стандартная компоновка для исходных файлов вашего проекта, и использует функцию подстановки для создания правил make-файла на лету, которые затем обрабатываются, обрабатывают зависимости файла заголовка, кросс-компиляцию, модульные тесты установка и упаковка.

[edit] На данный момент я использую cmake для всех своих проектов, поскольку он генерирует полезные файлы проектов для многих систем сборки.

Джефф Кофинофф

0 голосов
/ 14 ноября 2008

SConstruct с опцией отладки:

env = Environment()

if ARGUMENTS.get('debug', 0):
    env.Append(CCFLAGS = ' -g')

env.Program( source = "template.cpp" )
0 голосов
/ 13 ноября 2008

Несколько хороших рекомендаций по созданию базового Makefile

http://en.wikipedia.org/wiki/Make_(software)

http://mrbook.org/tutorials/make/

http://www.opussoftware.com/tutorial/TutMakefile.htm

http://www.hsrl.rutgers.edu/ug/make_help.html

У первой пары, в частности, есть минимальный пример Makefile, который вы описали. Надеюсь, это поможет.

...