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 etwag++ -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)