Минимальный 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++