Millä tavalla makefile kannattaa rakentaa, jotta monitasoisesta lähdekoodikansiosta saadaan käännettyän objektitiedostot objektikansioon? Tällä hetkellä olen rakentanut makefilen alla olevaan tapaan, jolla objektitiedostot kääntyvät kiltisti oikeaan kansioon ja linkitys toimii oikein.
Tässä kuitenkin uudelleen kääntäminen kääntää koko projektin uudestaan, mutta olisi hyvä, jos kääntäminen kohdistuisi vain muuttuneille koodilistauksille. Tämän enempää höpisemättä laitan makefilen esille.
CC = g++ CFLAGS = -g -c -O -Wall -Wextra -pedantic -std=gnu++11 LDFLAGS = -lsfml-system -lsfml-window -lsfml-graphics -lsqlite3pp -lsqlite3 SOURCES = $(wildcard src/*.cpp) $(wildcard src/*/*.cpp) $(wildcard src/*/*/*.cpp) $(wildcard src/*/*/*/*.cpp) OBJECTS = $(SOURCES:.cpp=.o) OBJ = obj/ OBJ_FILES = $(OBJ)*.o EXECUTABLE = atcradar.exe RM = del RM_FILES = /s *.o all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(OBJ_FILES) $(LDFLAGS) -o bin/$(EXECUTABLE) .cpp.o: $(CC) $(CFLAGS) $(LDFLAGS) $< -o $(OBJ)$(notdir $@) clean: $(RM) $(RM_FILES)
Makefilessä on selvä virhe, joka selviää, jos tulostat kaikkien muuttujien sisällöt.
SOURCES = src/main.cpp OBJECTS = src/main.o OBJ_FILES = obj/*.o
Binäärin linkityksen riippuvuutena on määritelty src/main.o. Tiedostoa src/main.o ei kuitenkaan koskaan luoda, vaan sen luomiseen tarkoitettu kohta .cpp.o tuottaa oikeasti tiedoston obj/main.o. Koska make ei koskaan löydä vanhaa tiedostoa src/main.o, make ajaa käännöskomennon aina uudestaan.
Muuttujissa OBJECTS ja OBJ_FILES pitäisi olla täsmälleen sama sisältö, ts. pitäisi olla vain yksi OBJECTS-muuttuja.
Ratkaisu on käyttää .o.cpp:n sijaan %-merkintöjä:
build/%.o: src/% # huom, mkdir on tuunattava käyttöjärjestelmän mukaan mkdir -p $(dir $@) $(CXX) $(CXXFLAGS) $< -c -o $@
Tästäkin puuttuu vielä se ominaisuus, jolla saadaan systeemi tunnistamaan myös otsikkotiedostojen muutokset, jotka vaikuttavat muiden tiedostojen kääntämiseen. Sen osalta voit katsoa PutkaRTS:n Makefilen magiaa – ei ehkä kaunista mutta toimivaa.
Tai sitten voit vain ottaa jonkin valmiin ratkaisun, IDE:n, CMaken tms.
Kiitoksia mainiosta selityksestäsi ja selkeän virheen osoittamisesta. PutkaRTS:n makefile on luettu ja yritetty hymmärtää parhaan taidon mukaan. Siitä saikin sopivasti muokkaamalla oikein sopivan version aikaiseksi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.