minimum C++ make file for linux

Szukam prostego zalecanego "minimalnego" pliku Makefile c++ dla Linuksa, który będzie używał g++ do kompilacji i łączenia pojedynczego pliku z plikiem H. Najlepiej, aby plik make nie miał nawet fizycznych nazw plików i miał tylko a .cpp do .o transform. Jaki jest najlepszy sposób na wygenerowanie takiego pliku makefile bez zagłębiania się w Horrory autoconf?

Bieżący katalog zawiera na przykład

T.cpp t. h

I chcę, żeby powstał plik makefile. Próbowałem autoconf ale to zakłada .h to gcc zamiast g++. Tak, choć nie jestem początkującym, ponownie uczę się od lat najlepszych podejść do manipulacji projektami, a zatem Szukam zautomatyzowanych sposobów tworzenia i utrzymywania plików Makefile dla małych projektów.

Author: RichieHH, 2008-11-13

11 answers

Jeśli jest to pojedynczy plik, możesz wpisać

make t

I wywoła

g++ t.cpp -o t

To nawet nie wymaga pliku Makefile w katalogu, chociaż będzie się mylić, jeśli masz t.cpp i t. c i a t.java itd.itd.

Również prawdziwy 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 $<
 27
Author: hazzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 15:46:36

Oto ogólny plik makefile z katalogu MY code snippets:

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)
Tak długo, jak go masz .źródło cpp produkujące jeden plik binarny, nie potrzebujesz niczego więcej. Używałem go tylko z GNU make, a generowanie zależności używa składni gcc (również wspieranej przez icc). Jeśli używasz kompilatorów SUN, musisz zmienić " - MMD "na"- xMMD". Upewnij się również, że karta na początku linii po clean: nie zostanie zmieniona na spacje po wklejeniu tego kodu lub make da ci brakujący błąd separatora.
 17
Author: florin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-25 20:58:55

Oglądałeś SCons ?

Po prostu utwórz plik SConstruct o następującej treści:

Program("t.cpp")

Następnie wpisz:

scons
Zrobione!
 8
Author: grieve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-06 15:09:21

Zakładając Brak wstępnie skonfigurowanych ustawień dla całego systemu 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
 4
Author: Alnitak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 15:47:11

OglądałeśOMake ?

OMakeroot

open build/C
DefineCommandVars()
.SUBDIRS: .

OMakefile

.DEFAULT: $(CXXProgram test, test)

Następnie w Linuksie lub Windows po prostu wpisz:

omake

Jako bonus otrzymujesz automatycznie:

  • parallel buduje z opcją-j (taką samą jak make).
  • sumy kontrolne MD5 zamiast znaczników czasu (build staje się odporny na awarie synchronizacji czasu).
  • automatyczne i dokładne zależności nagłówka C / C++.
  • dokładne zależności między katalogami (coś, czego nie oferuje rekurencyjny make).
  • przenośność(1 łańcuch budowania, aby rządzić nimi wszystkimi, odporny na problemy ze stylem ścieżki).
  • prawdziwy język programowania (lepszy od GNU make).
 1
Author: bltxd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-14 09:14:50

Dość mały plik GNU Makefile, wykorzystujący predefiniowane reguły i auto-deps:

CC=c++
CXXFLAGS=-g -Wall -Wextra -MMD
LDLIBS=-lm
program: program.o sub.o
clean:
    $(RM) *.o *.d program
-include $(wildcard *.d)
 1
Author: Sam Watkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-31 14:30:42

Kilka dobrych odniesień do tworzenia podstawowego pliku Makefile

Http://en.wikipedia.org/wiki/Make_ (oprogramowanie)

Http://mrbook.org/tutorials/make/

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

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

Pierwsza para w szczególności ma minimalne przykładowe pliki Makefile, jak opisywałeś. Mam nadzieję, że to pomoże.

 0
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 15:46:46

SConstruct z opcją debugowania:

env = Environment()

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

env.Program( source = "template.cpp" )
 0
Author: RichieHH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-14 00:53:14

Florin ma dobry punkt wyjścia. Nie podobał mi się gnu autoconf, więc zacząłem tam i zająłem się tą koncepcją i nazwałem ją MagicMakefile. Mam 3 wersje od prostych do bardziej złożonych. Najnowsze jest teraz na GitHubie: https://github.com/jdkoftinoff/magicmake

Zasadniczo zakłada, że masz standardowy układ dla plików źródłowych projektu i używa funkcji wildcard do tworzenia reguł makefile w locie, które są następnie ewalowane, obsługując plik nagłówkowy zależności, kompilacji krzyżowej, testów jednostkowych, instalacji i pakowania.

[Edytuj] w tym momencie używam cmake dla wszystkich moich projektów, ponieważ generuje on przydatne pliki projektów dla wielu systemów budowania.

Jeff koftinoff

 0
Author: jdkoftinoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-31 23:39:42

Szukałem tego, jak może wyglądać minimalny Makefile inny niż

some_stuff:
    @echo "Hello World"

Wiem, że jestem spóźniona na tę imprezę, ale pomyślałam, że też wrzucę kapelusz na ring. Poniżej znajduje się mój jeden projekt katalogu Makefile używam od lat. Z niewielką modyfikacją skaluje się do korzystania z wielu katalogów (np. src, obj, bin, header, test, itp.). Zakłada, że wszystkie nagłówki i pliki źródłowe znajdują się w bieżącym katalogu. I, trzeba nadać projektowi nazwę, która jest używana do wyjściowa nazwa binarna.

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
Author: Bob Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 23:20:03

Jeśli Twoje problemy są spowodowane tym, że autoconf uważa, żeplik h jest plikiem c, spróbuj zmienić jego nazwę na .hpp lub .h++

 -1
Author: Adam Tegen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-13 15:45:06