Plik Makefile

0

Witam. Chciałem się nauczyć chociaż podstaw tworzenia pliku Makefile i mam taki problem. Stworzyłem prosty plik Makefile:

CXX = mingw32-g++
CXXFLAGS = -g
CC  = mingw32-gcc-4.4.1
RESULTFILE = test.exe

MAINOBJS = main.o
ALLOBJS = main.o

main.o: main.cpp
	$(CXX) $(CXXFLAGS) $^ -o $@


$(RESULTFILE): $(MAINOBJS)
	$(CXX) $(CXXFLAGS) $^ -o $@


clean:
	rm -f $(ALLOBJS)

.PHONY: ALLOBJS clean

main.cpp:

#include <iostream>

using namespace std;

int main()
{
  cout << "Hello world!";
  cin.get();
  return 0;
}

i wywołuje to z wiersza poleceń (mam w zmiennej systemowej globalnej PATH ustawioną ścieżkę do mingw\bin) o tak:
mingw32-make

Chciałbym, aby ten plik stworzył mi plik main.o, następnie ten pojedynczy plik.o "zalinkował" main.exe (w sumie bezsensownie jest to nazwane w tym wypadku linkowaniem, bo wstarczy zmienić rozszerzenie, ale później chciałem tam dodać więcej plików .o stąd takie obejście). Później ten plik plik main.o byłby skasowany. Plik jednak tworzy mi sam main.o i na tym koniec.

z góry dziękuję za pomoc

0
CC 	=  mingw32-g++
CFLAGS	= -ansi -pedantic -Wall
LDFLAGS = -O2
PROGRAM	= wynikowy
SRCS	= main.cpp
OBJS	= $(SRCS:.cpp=.o)

$(PROGRAM): $(OBJS)
	$(CC) $(LDFLAGS) -o $(PROGRAM) $(OBJS)

clean:
	rm -f $(PROGRAM) $(OBJS)
0

działa.. :) ale mógłbyś mi jeszcze wyjaśnić, w którym momencie są tworzone te pliki .o? bo widzę że są zalinkowane o tutaj:
$(CC) $(LDFLAGS) -o $(PROGRAM) $(OBJS) ale kiedy one są kompilowane? co robi:

clean:
        rm -f $(PROGRAM) $(OBJS)

bo nie widzę żeby coś to kasowało...

sorry za takie pytania, ale lubię wiedzieć jak coś działa zanim zacznę tego używać.. :)

i dlaczego ten makefile, który ja napisałem nie działał.. co w nim było niepoprawnie?

0

poczytałem trochę o tym.. jednak chciałbym zrobić coś takiego:

  1. definiuje pliki .c w projekcie
  2. definiuje pliki .cpp w projekcie
  3. tworze ze wszystkich pliki .o
  4. linkuje je do okreslonego exe

próbuje to zrobić dla samych plików .cpp, jednak pomimo zdefiniowania reguły dla plików .cpp, pokazuje mi że nie ma reguły dla pliku main.cpp:

Makefile:

# opcje kompilatora C++
CXX      = mingw32-g++
CXXFLAGS = -c -ansi -pedantic -Wall -O2

# opcje kompilatora C
CC     = mingw32-gcc-4.4.1
CFLAGS = -g

RESULTFILE = test.exe

SRCS        = main.cpp
OBJS        = $(SRCS:.cpp=.o)

all: $(SRCS) $(RESULTFILE)


$(RESULTFILE): $(OBJS)
	$(CXX) $^ -o $@


%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@


clean:
	rm -f $(RESULTFILE) $(OBJS)


.PHONY: all clean

próbowałem tą regułę też tak definiować:

%.o: %.cpp
	$(CXX) $(CXXFLAGS) $< -o $@

ale pokazuje mi dokładnie to samo... nie mogę znaleźć żadnej porządnej treści na ten temat poza dokumentacją, która jest dla mnie aktualnie zbyt trudna..

EDIT:
Już wiem co nie działało :D
przypadkiem usunęłem (lub napisałem coś w makefile clean co to zrobiło) main.cpp, bez tego raczej nie pójdzie :P

mógłby mi ktoś powiedzieć jak zrobić żeby plik exe, który wyświetla tekst nie zajmował aż 900kb? O_O jak wywalić z niego zbędny balast?

1 użytkowników online, w tym zalogowanych: 0, gości: 1