Linker / Compiler Problem



  • wie schaffe ich es, dass das makefile auch dateien aus einem unterverzeichnis compilieret und am ende auch linkt. die .o dateinen sollten dann bitte auch im verzeichnis angelegt werden, di quelldateien sind?



  • du musst bei der Makefile aus der FAQ ja nur die wildcard erweitern um das Unterverzeichniss



  • Hier eine verbesserte Version, da funktioniert das auch mit den obj-Dateien in Unterverzeichnissen:

    TARGET   :=./programm
    CXXFLAGS :=-g -W -Wall
    CXX      :=g++
    LIBS     :=
    
    SOURCES  :=$(wildcard *.cc)
    OBJECTS  :=$(patsubst %.cc,%.o,$(SOURCES))
    DEPS     :=$(patsubst %.cc,%.dep,$(SOURCES))
    
    all: $(TARGET)
    
    run: $(TARGET)
    	$(TARGET)
    
    $(TARGET): $(OBJECTS) $(DEPS)
    	$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)
    
    -include $(DEPS)
    
    %.o: %.cc
    	$(CXX) $(CXXFLAGS) -c $< -o $@
    
    %.dep: %.cc
    	$(CXX) $(CXXFLAGS) -MM $< -MT $(<:.cc=.o) > $@
    
    .PHONY: clean
    clean:
    	rm -f $(TARGET) $(OBJECTS) $(DEPS)
    


  • wenn ich das Makefile wie fogt mache:
    TARGET := test
    CXXFLAGS :=-Wall -I./include
    CXX :=g++
    LIBS :=
    SOURCES :=(wildcard.cpp,wildcard./include/.cppOBJECTS:=(wildcard *.cpp, wildcard ./include/*.cpp OBJECTS :=(patsubst %.cpp, %.o, (SOURCES))DEPS:=(SOURCES)) DEPS :=(patsubst %.cpp, %.dep, $(SOURCES))

    all: $(TARGET)

    $(TARGET): $(OBJECTS) (DEPS)(DEPS) (CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)

    -include $(DEPS)

    %.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o @ %.dep: %.cpp (CXX) $(CXXFLAGS) -MM $< -MT $(<:.cpp=.o) > $@

    .PHONY: clean
    clean:
    rm -f $(TARGET) $(OBJECTS) $(DEPS)

    bekomme ich folgenden fehler vom linker:
    /usr/lib/crt1.o: In function _start': /usr/lib/crt1.o(.text+0x18): undefined reference tomain'
    collect2: ld returned 1 exit status
    make: *** [test] Fehler 1
    was ist denn da falsch gelaufen?
    was bewirkt $<, $(<:.cpp=.o) >, -MM und -MT?



  • deine sources-Zeile ist falsch, sollte so aussehen:

    SOURCES  :=$(wildcard *.cpp include/*.cpp)
    


  • da stand ein kommentar hinter, den ich für den eintrag ins forum gelöscht habe. dabei ist die klammer flöten gegangen. im makefile ist sie natürlich drin.



  • ja, aber schaus dir nochmal genau an. Du hast ein 'wildcard' zuviel.



  • das war es.



  • das war es.



  • uh, das erinnert mich daran, dass ich die Makefile in der FAQ updaten wollte 🙂 :xmas2:


Anmelden zum Antworten