Минимальный C++ make файл для linux

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

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

t.cpp th

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

11 ответов

Решение

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

make t

И это вызовет

g++ t.cpp -o t

Для этого даже не требуется Makefile в каталоге, хотя он запутается, если у вас есть t.cpp, tc, 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 $<

Вот общий 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 даст вам пропущенную ошибку разделителя.

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

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

Program("t.cpp")

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

scons

Готово!

Предполагая, что нет предварительно настроенных общесистемных 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

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

CC=c++
CXXFLAGS=-g -Wall -Wextra -MMD
LDLIBS=-lm
program: program.o sub.o
clean:
    $(RM) *.o *.d program
-include $(wildcard *.d)

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

OMakeroot

open build/C
DefineCommandVars()
.SUBDIRS: .

OMakefile

.DEFAULT: $(CXXProgram test, test)

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

omake

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

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

Несколько хороших ссылок на создание базового 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

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

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

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

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

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

Я охотился за тем, как может выглядеть минимальный 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)

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

env = Environment()

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

env.Program( source = "template.cpp" )

Если ваши проблемы связаны с тем, что autoconf считает файл.h файлом a c, попробуйте переименовать его в.hpp или.h++

Другие вопросы по тегам