samm
2010-03-24, 22:37:28
Hallo zusammen,
Nachdem ich mir nun Tutorials durchgelesen habe etc. steh ich immer noch auf dem Schlauch: Ich arbeite an einem C++-Projekt auf Linux, und muss ein Makefile schreiben, was die Chose kompiliert. Nun habe ich eine Ordnerstruktur, die so aussehen soll:
-[Projekt]
Makefile
Readme
...
- -[src]
bla.cpp
...
- -[include]
- - -[libA]
libx.hpp
liby.hpp
...
- - -[libB]
bla.hpp
...
- -[build]
bla.o
KompiliertesExecutable
Also: Das Makefile liegt im Grundordner, dann gibt es diverse Unterordner. Meine Sourcefiles binden die benötigte library libx.hpp via
#include "../include/libA/libx.hpp"
ein, allerdings hängt die lipx.hpp wiederum mittels
#include <include/lib/liby.hpp>
von andern libraries im gleichen Ordner ab.
Wie gestalte ich nun das Makefile so, dass ich das ganze kompilieren kann, sodass die Dateien in ihren jeweiligen Unterordnern liegen bleiben können und das Kompilat im richtigen Unterordner landet? Die includes in meinen Source- und Header-Files kann ich abändern, die in den Library-Files nicht. Meine Source-Files kann ich auch verschieben (ausser in den [lib]-Ordner), und ob das Kompilat nun wirklich im [build]-Ordner landet, ist nicht dermassen wichtig. Die "Header-Files" von [libA] enthalten den Sourcecode der Library, kompilierte habe ich nicht. Die Header-Files von [libB] sind einfach die Header-Files zu meinen Source-Files.
Das einzige, was ich hinbringe, ist, den make-Prozess zu starten, wenn das Makefile auch im Ordner [src] liegt, dann motzt aber der compiler, weil er die includes innerhalb der library-Files nicht auflösen kann. Das Makefile enthält sowas (ja, es ist nicht gerade aufgeräumt, enthält ungentutze Variabeln von fehlgeschlagenen Versuchen etc....)
SRCDIRS = src
INCDIRS = $(SRCDIRS) include/libA include/libB /usr/include/c++/4.4.1
CPP = g++
CFLAGS = $(INCDIRS) -O0
DBG = -g3
LFLAGS =
LIBDIRS = $(INCDIRS)
LIBS =
OBJS = bla.o
EXECUTABLE = MyExec
all: ${EXECUTABLE}
program: ${EXECUTABLE}
run: program
./${EXECUTABLE}
${EXECUTABLE}: ${OBJS}
$(CPP) $(LFLAGS) $(DBG) $(OBJS) $(LIBDIRS) $(LIBS) -o $@
%.o : %.cpp %.h
$(CPP) $(CFLAGS) $(DBG) -c $< -o $@
clean:
- rm *.o *~
- rm ${EXECUTABLE}
depend: *.h *.cpp
- rm depend
$(CPP) $(CFLAGS) $(DBG) -MM *.cpp > depend
include depend
Ihr müsst mir jetzt nicht das Makefile schreiben (ausser ihr wollt ;)), aber um Antworten, wie ich die verschiedenen Unterordner handhaben kann, darüber wäre ich sehr dankbar!
Nachdem ich mir nun Tutorials durchgelesen habe etc. steh ich immer noch auf dem Schlauch: Ich arbeite an einem C++-Projekt auf Linux, und muss ein Makefile schreiben, was die Chose kompiliert. Nun habe ich eine Ordnerstruktur, die so aussehen soll:
-[Projekt]
Makefile
Readme
...
- -[src]
bla.cpp
...
- -[include]
- - -[libA]
libx.hpp
liby.hpp
...
- - -[libB]
bla.hpp
...
- -[build]
bla.o
KompiliertesExecutable
Also: Das Makefile liegt im Grundordner, dann gibt es diverse Unterordner. Meine Sourcefiles binden die benötigte library libx.hpp via
#include "../include/libA/libx.hpp"
ein, allerdings hängt die lipx.hpp wiederum mittels
#include <include/lib/liby.hpp>
von andern libraries im gleichen Ordner ab.
Wie gestalte ich nun das Makefile so, dass ich das ganze kompilieren kann, sodass die Dateien in ihren jeweiligen Unterordnern liegen bleiben können und das Kompilat im richtigen Unterordner landet? Die includes in meinen Source- und Header-Files kann ich abändern, die in den Library-Files nicht. Meine Source-Files kann ich auch verschieben (ausser in den [lib]-Ordner), und ob das Kompilat nun wirklich im [build]-Ordner landet, ist nicht dermassen wichtig. Die "Header-Files" von [libA] enthalten den Sourcecode der Library, kompilierte habe ich nicht. Die Header-Files von [libB] sind einfach die Header-Files zu meinen Source-Files.
Das einzige, was ich hinbringe, ist, den make-Prozess zu starten, wenn das Makefile auch im Ordner [src] liegt, dann motzt aber der compiler, weil er die includes innerhalb der library-Files nicht auflösen kann. Das Makefile enthält sowas (ja, es ist nicht gerade aufgeräumt, enthält ungentutze Variabeln von fehlgeschlagenen Versuchen etc....)
SRCDIRS = src
INCDIRS = $(SRCDIRS) include/libA include/libB /usr/include/c++/4.4.1
CPP = g++
CFLAGS = $(INCDIRS) -O0
DBG = -g3
LFLAGS =
LIBDIRS = $(INCDIRS)
LIBS =
OBJS = bla.o
EXECUTABLE = MyExec
all: ${EXECUTABLE}
program: ${EXECUTABLE}
run: program
./${EXECUTABLE}
${EXECUTABLE}: ${OBJS}
$(CPP) $(LFLAGS) $(DBG) $(OBJS) $(LIBDIRS) $(LIBS) -o $@
%.o : %.cpp %.h
$(CPP) $(CFLAGS) $(DBG) -c $< -o $@
clean:
- rm *.o *~
- rm ${EXECUTABLE}
depend: *.h *.cpp
- rm depend
$(CPP) $(CFLAGS) $(DBG) -MM *.cpp > depend
include depend
Ihr müsst mir jetzt nicht das Makefile schreiben (ausser ihr wollt ;)), aber um Antworten, wie ich die verschiedenen Unterordner handhaben kann, darüber wäre ich sehr dankbar!