C++-Libary erstellen, Linux



  • Hallo,

    Für das Erstellen einer C++-Library (unter 64bit-Linux) kommt Libtool in
    Kombination mit einem handgeschriebenen Makefile zum Einsatz. Compilieren,
    Installieren und Verwenden der Lib funktioniert auf meinem Rechner bestens.
    Trotzdem würde ich gerne diskutieren, ob mein Makefile zum Erstellen von C++-
    Libaries in Ordnung ist, da die binär weitergegebenen Libs auch auf anderen
    Systemen problemfrei funktionieren sollen.

    LIB_FILENAME=libfd
    
    CXXFLAGS = \
    	-O3 \
    	-Wextra \
    	-Wunused \
    	-Wall \
    	-frounding-math \
    	-DNDEBUG 
    
    LDFLAGS =  -lboost_program_options-mt -lboost_filesystem -lboost_system 
    LTLCXX=libtool --tag=CXX --mode=compile g++ $(CXXFLAGS) -c
    
    # Objects to be linked
    LOBJECTS= Cell2.lo Point2.lo Ball.lo Segment.lo Visualizer.lo tools.lo Parameters.lo Color.lo Label.lo HCube2.lo 
    
    # Link the lib
    all:	$(LOBJECTS)
    	libtool --tag=CXX --mode=link g++ -o $(LIB_FILENAME).la $(LOBJECTS) -rpath /usr/local/lib $(LDFLAGS)	
    
    # Install the lib
    install: all 
    	libtool --tag=CXX --mode=install install -c $(LIB_FILENAME).la /usr/local/lib/$(LIB_FILENAME).la	
    
    # Compile the source
    HCube2.lo: HCube2.cpp HCube2.h 
    	$(LTLCXX) HCube2.cpp
    
    Parameters.lo: Parameters.cpp Parameters.h 
    	$(LTLCXX) Parameters.cpp
    
    Point2.lo: Point2.cpp Point2.h 
    	$(LTLCXX) Point2.cpp
    
    Ball.lo: Ball.cpp Ball.h 
    	$(LTLCXX) Ball.cpp
    
    Label.lo: Label.cpp Label.h 
    	$(LTLCXX) Label.cpp
    
    Segment.lo: Segment.cpp Segment.h 
    	$(LTLCXX) Segment.cpp
    
    Cell2.lo: Cell2.cpp Cell2.h Point2.cpp Point2.h
    	$(LTLCXX) Cell2.cpp
    
    tools.lo: tools.cpp tools.h 
    	$(LTLCXX) tools.cpp
    
    Color.lo: Color.cpp Color.h 
    	$(LTLCXX) Color.cpp
    
    Visualizer.lo: Visualizer.cpp Visualizer.h 
    	$(LTLCXX) Visualizer.cpp
    
    clean:
    	rm -f *.lo
    	rm -f *.o
    	rm -f $(LIB_FILENAME)
    

    Ich freue mich über Verbesserungsvorschläge.

    Danke, lg



  • Ich würde Makefiles nicht per Hand schreiben. Das ist einfach müselig und eine Garantie dafür, dass es auf vielen anderen Systemen nicht funktionieren wird und der build-Prozess extrem unangenehm wird, weil man dann in der Makefile rumwühlen darf, um rauszufinden welche Flags man für sein System anpassen darf. Benutz lieber autotools oder CMake oder waf oder oder

    Wenn Du wirklich die Makefile weiterhin von Hand schreiben willst, dann schau dir vielleicht mal die ultimative Makefile als Inspiration an. Da werden zumindest die Abhängigkeiten automatisch ermittelt, damit du die nicht mehr händisch verwalten musst. Ansonsten solltest du bei den Targets die keine echten Dateien sind (zB all, clean, install), solltest du als "PHONY" markieren.

    Bei den CXXFLAGS würde ich noch -ansi (oder -std=c++0x) und -pedantic-errors verwenden. Außerdem gibt es noch -march=native und -mtune=native wenn du mehr Geschwindigkeit rausholen willst.

    Außerdem würde ich eher

    CXX := libtool --tag=CXX --mode=compile g++
    
    foo.lo: foo.cpp
      $(CXX) $(CXXFLAGS) -c foo.cpp
    

    benutzen, als die Flags fix zu kodieren. So kannst du nämlich problemlos auch die impliziten Regeln nutzen.



  • Hallo, und danke für die Infos!

    Händische geschriebene Makefiles lassen das Bauen sehr direkt steuern, daher
    setze ich die gerne ein. Im Gegensatz zu automatischen Tools weiß man ganz
    genau was wie gemacht wird. Aber Du hast recht, daß händische Makefiles auch
    recht komplex werden können. Daher habe ich mich nun in CMake eingelesen.
    Das Tool baut mein Projekt bereits einwandfrei. Das übersetzen wird nun mit
    Zeilen wie:

    [  7%] Building CXX object CMakeFiles/dt2.dir/HCube2.cpp.o
    

    angezeigt. Besser wäre aber, hier den exakten Befehl angezeigt zu bekommen,
    mit dem cmake den Compiler aufruft, also etwa

    g++ -O3 -Wextra -Wunused -Wall -ansi -pedantic-errors -frounding-math -DNDEBUG  -c HCube2.cpp
    

    Gibts dafür eine Option in cmake?

    EDIT: Stopp, ich habe es gefunden:

    set(CMAKE_VERBOSE_MAKEFILE ON)
    

Anmelden zum Antworten