Подтвердить что ты не робот

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

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

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

t.cpp t.h

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

4b9b3361

Ответ 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)

Ответ 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 ++