R.....y
R.....y
#naukaprogramowania #programowanie #cpp #linux

kiedyś widziałem Makefile, który sprawdzał które pliki zedytowałem, robił ich pliki z rozszerzeniem .o, i linkował w jeden plik do odpalenia. Pozwalało to nie kompilować na nowo plików których nie zmieniałem, co oszczędzało kupę czasu. Jak taki plik napisać?

Mój aktualny makefile:
CC=g++
LINKERFLAGS=-lSDL2 -lSDL2gfx -lSDL2image
COMPILERFLAGS=-Wall -pedantic -Wextra -g -std=c++20
INPUT=src/main.cpp src/Engine/Engine.cpp src/Object/Object.cpp src/functions.cpp
OUTPUT=Output/Game

target:
$(CC) $(INPUT) $(LINKERFLAGS) $(COMPILERFLAGS) -o $(OUTPUT)
1
  • Najlepsze
  • Wszystkie komentarze
MamCieNaHita
@RedveKoronny: https://stackoverflow.com/questions/2908057/can-i-compile-all-cpp-files-in-src-to-os-in-obj-then-link-to-binary-in

osobiście polecam zaprzyjaźnić się z CMake, wtedy będzie rekompilowywał także pliki cpp także jeżeli zmienisz coś w zależnych hpp(goły makefile tego nie ogarnia)
5
dzbanek123
@RedveKoronny: 1. Potrzebujesz wpis, który skompiluje pliki .o jeśli zmieniły się pliki .cpp:
%.o: %.cpp
$(CXX) $(CXXFLAGS) $< -c
2. Warto skorzystać z opcji MMD, bo plik cpp mógł zostać bez zmian, ale mogły się pozmieniać pliki nagłówkowe .h
3. W linijce "target:" dodajesz zależność od składowych obiektów .o
3
R.....y
R.....y
@MamCieNaHita: podziękuję za cmake
2
Utylizacja
@RedveKoronny: Po nazwie targetu po dwukropku wpisujesz nazwy plików źródłowych i make sobie sam sprawdza daty, czy nowszy i odpalić dla niego

target: file.cpp
Chyba zadziała jak wpiszesz po prostu tą zmienną $(INPUT) tam
1
Utylizacja
1
inspektor_gadzet
@RedveKoronny: weź cmake, generator Ninja i ruszyć jeszcze budowanie wielowątkowe. Pójdzie jak rakieta
1
R.....y
R.....y
MamCieNaHita: podziękuję za cmake


@inspektor_gadzet:
1
inspektor_gadzet
@RedveKoronny: dlaczego? Właśnie ta funkcjonalność oferuje cmake. Jak mu podasz listę plików to sam będzie kontrolować czy są jakieś zmiany. Bez sensu klepac samemu całego makefile z podziałem na etapy budowania. To samo oferuje cmake jak mu podasz jako parametr żeby generował makefile
1
R.....y
R.....y
@Utylizacja: idzie tak samo wolno idk czemu
0
Utylizacja
@RedveKoronny: Aaaa no tak, trzeba dodać jeszcze ten etap z .o, poczekaj, znajde
0
dict
@RedveKoronny: @inspektor_gadzet: ja też nie lubię cmake
0
Oo-oO
stare cmake dla mnie jest nieprzyjemne, nowe jest nieco lepsze, natomiast meson wygląda dość zacnie (i też używa ninja jako backendu).
0
inspektor_gadzet
@dict: mam projekt na 30 plików źródłowych, 7 repo, bez cmake bym tego nie ogarnął. No mi multiplatformowo musi się budować
0