Programm zum erzeugen von Makefiles



  • Ich würde gern in Zukunft Notepad++ als Texteditor zum Programmieren nehmen, allerdings weiss ich nicht wie man makefiles schreibt. Deswegen lautet meine Frage, ob es für "normales" c++ ein Programm wie qmake (für qt) gibt, dass für einem das Erstellen einer Makefile übernimmt und die Verweise auf die .lib's, .a's etc. automatisch setzt. Wenn es dies nicht gibt, könnte mir villeicht jemand erklären wie man zb. Winsock einbindet (nur einbindet, Benutzung ist mir klar)

    Ich hab bis jetzt immer Code::Blocks benutzt und da kann man einfach in den Linkeroptionen einstellen welche Bibliotheken gelinkt werden sollen, jedoch möchte ich dies nun auch ohne ein derartiges GUI bewerkstelligen

    Vielen dank schonmal



  • nochmal anders formuliert. Ich habe eine neue Klasse geschrieben, die sich in eine Headerdatei (car.h) und eine Implementationsdatei (car.cpp) aufteilt. Main.cpp soll nun diese Klasse nutzen können - Wie bewerkstelle ich dies und wie binde ich zusätzliche Bibliotheken ein?



  • Ich nehme mal an du benutzt den Compiler MinGW, Richtig?
    Dann kannst du Librarys einfach mit der Option -l einbinden. Wenn deine Library libfoo.a heißt machst du dann einfach g++ -lfoo main.cpp -o mein_programm.exe
    , das lib und das .a musst du also weglassen wenn du den Namen angibst.
    Wenn die Library nicht in einem Standard Pfad ist musst du noch den Pfad mit -L angeben z. B. g++ -lfoo -Lc:\mein\library\pfad main.cpp -o mein_programm.exe .

    Wenn du mehrere cpp Files hast kannst du das einfach so angeben
    g++ car.cpp main.cpp -o mein_programm.exe .



  • zB CMake

    aber schau dir doch einfach die ultimative Makefile in der rudpf FAQ an 🙄



  • Zum testen hab ich einfach nochmal das altbekannte Billigprogramm geschrieben. Im makefile habe cih ncihts verändert (hätte ich etwas ändern müssen?)

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	cout<<"Hallo Welt!"<<endl;
    	system("pause");
    	};
    

    Make liefert mir einen Fehler:

    main.cpp:2: *** missing separator. Stop.

    Die Makefile sieht so aus

    TARGET		:= ./program 
    CXXFLAGS	:= -g -W -Wall -Wno-long-long -pedantic -std=c++98 
    CXX			:= g++ 
    LIBS		:= 
    EXT			:= cpp 
    BUILDDIR	:= build 
    
    override BUILDDIR 	:= $(strip $(BUILDDIR)) 
    SOURCES				:= $(wildcard *.$(EXT)) 
    OBJECTS				:= $(patsubst %.$(EXT), $(BUILDDIR)/%.o, $(SOURCES)) 
    DEPS				:= $(patsubst %.$(EXT), $(BUILDDIR)/%.dep, $(SOURCES)) 
    
    .PHONY: all 
    all: $(TARGET) 
    
    $(TARGET): $(OBJECTS) $(DEPS) 
    	$(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) 
    
    ifneq ($(MAKECMDGOALS), clean) 
    -include $(DEPS) 
    endif 
    
    $(OBJECTS): $(BUILDDIR)/%.o: %.$(EXT) $(BUILDDIR)/%.dep $(BUILDDIR)/.tag 
    	$(CXX) $(CXXFLAGS) -c $< -o $@ 
    
    $(DEPS): $(BUILDDIR)/%.dep: %.$(EXT) $(BUILDDIR)/.tag 
    	$(CXX) $(CXXFLAGS) -MM $< -MT $@ -MT $(<:.$(EXT)=.o) -o $@ 
    
    %.tag: 
    	mkdir -p $(dir $(@)) 
    	touch $@ 
    
    .PHONY: clean 
    clean: 
    	rm -rf $(BUILDDIR)
    


  • Ok, die Standartmakefile funktioniert nun. Kann mir villeicht noch jemand kurz erklären in welcher Form Bibliotheken unter libs eingetragen werden müssen?

    LIBS := -libwsock32.a

    liefert

    g++ -g -W -Wall -Wno-long-long -pedantic -std=c++98 -o ./program  build/car.o  b
    uild/main.o -libwsock32.a
    D:\mingw\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot fin
    d -libwsock32.a
    collect2: ld returned 1 exit status
    mingw32-make: *** [program] Error 1
    

Anmelden zum Antworten