Минимальный файл С++ make для linux
Я ищу, чтобы найти простой рекомендованный "минимальный" С++ makefile для linux, который будет использовать g++ для компиляции и ссылки на один файл и h файл. В идеале файл make даже не имеет имен физического файла в нем и имеет только преобразование .cpp в .o. Каков наилучший способ создания такого make файла без погружения в ужасы autoconf?
Текущий каталог содержит, например,
t.cpp
t.h
и я хочу создать make файл для этого. Я попробовал autoconf, но его предположение .h - gcc вместо g++. Да, но не новичок, я много лет назад пересматриваю лучшие подходы к манипулированию проектами и, следовательно, ищу автоматические способы создания и поддержки make файлов для небольших проектов.
Ответы
Ответ 1
Если это один файл, вы можете ввести
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 $<
Ответ 2
Вот общий файл makefile из каталога моих фрагментов кода:
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
даст вам отсутствующую ошибку разделителя.
Ответ 3
Вы просмотрели SCons?
Просто создайте файл SConstruct со следующим:
Program("t.cpp")
Затем введите:
scons
Готово!
Ответ 4
Предполагая, что в настройках системы 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 [email protected] $(CXXFLAGS) $(LDFLAGS) test.o
.cpp.o:
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<
test.cpp: test.h
Ответ 5
Вы посмотрели OMake?
OMakeroot
open build/C
DefineCommandVars()
.SUBDIRS: .
OMakefile
.DEFAULT: $(CXXProgram test, test)
Затем в Linux или Windows просто введите:
omake
В качестве бонуса вы автоматически получаете:
- параллельная сборка с параметром -j (то же самое, что и make).
- Контрольные суммы MD5 вместо временных меток (сборка становится устойчивой к сбоям синхронизации времени).
- Автоматические и точные зависимости заголовков C/С++.
- Точные зависимости между каталогами (то, что рекурсивный make не предлагает).
- Переносимость (1 цепочка сборки, чтобы управлять всеми ими, невосприимчива к проблемам стиля пути).
- Реальный язык программирования (лучше, чем GNU make).
Ответ 6
довольно небольшой файл GNU Makefile с использованием предопределенных правил и автоматических депо:
CC=c++
CXXFLAGS=-g -Wall -Wextra -MMD
LDLIBS=-lm
program: program.o sub.o
clean:
$(RM) *.o *.d program
-include $(wildcard *.d)
Ответ 7
Некоторые хорошие ссылки на создание основного 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, как вы описывали. Надеюсь, что это поможет.
Ответ 8
Сконструировать с помощью опции отладки:
env = Environment()
if ARGUMENTS.get('debug', 0):
env.Append(CCFLAGS = ' -g')
env.Program( source = "template.cpp" )
Ответ 9
Флорин имеет хорошую отправную точку. Мне не понравился gnu autoconf, поэтому я начал там и принял концепцию дальше и назвал ее MagicMakefile. У меня есть 3 версии от простого до более сложного. Последнее относится к github: https://github.com/jdkoftinoff/magicmake
В принципе, предполагается, что у вас есть стандартная компоновка исходных файлов вашего проекта и используется функция подстановочных знаков для создания правил makefile на лету, которые затем проверяются, обрабатывают зависимости файлов заголовков, кросс-компиляцию, модульные тесты, установки и упаковки.
[edit] В этот момент я использую cmake для всех моих проектов, так как он генерирует полезные файлы проектов для многих систем сборки.
jeff koftinoff
Ответ 10
Если ваши проблемы связаны с тем, что autoconf думает, что файл .h является c файлом, попробуйте переименовать его в .hpp или .h ++