Probleme mit Make/Linken

jojomp

Mitglied
Hallo,

ich hab mich jetzt mal ein bisschen mit Make und dem dynamischen Linken beschäftigt und möchte mein kleines C++ Projekt gerne dementsprechend umbauen. Da ich ja jetzt die Dateien einzeln in .o Dateien kompiliere, muss ich ja in jede Datei die benötigten (teilw. selbstgeschriebenen) Funktionen mit #include einbauen. Das Problem bei der Sache ist jetzt aber, dass der g++ jetzt wegen mehrfacher Definitionen meckert. Ich hab mir gedacht, ich könnte das vielleicht lösen, indem ich entsprechende .h Dateien schreibe (die nur die Deklarationen enthalten), statt die .cpp - Datei zu includen, was aber auch nicht alle Probleme löst.

Hier erst mal das Makefile:
Code:
CC      = /usr/bin/g++
CFLAGS  = `sdl-config --cflags` -O2
LDFLAGS = -lSDL -lSDL_ttf -lSDL_mixer

OBJ = functions.o Sprite.o Mesg.o credits.o menu.o main.o

bshooter: $(OBJ)
	$(CC) $(CFLAGS) -o bshooter $(OBJ) $(LDFLAGS)

%.o: include/%.cpp
	$(CC) $(CFLAGS) -c $<
clean: $(OBJ)
	rm $+

Und dann z.B. folgendes in der functions.h:
Code:
// functions.h
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

#include <SDL/SDL.h>
#include <SDL_ttf.h>
#include <SDL_mixer.h>

// irgendwelche Deklarationen

#endif

Und in der Hauptdatei, die ja das Herzstück ist, nehme ich dann die .cpp - Dateien:

Code:
// main.cpp
#include "functions.cpp"

Andere Dateien benutzen dann nur noch die .h ´s:

Code:
// menu.cpp
#include <SDL/SDL.h>
#include <SDL_ttf.h>
#include "functions.h"

Und wenn ich das ganze dann "make", kommen dann haufenweise Fehlermeldungen wie:
Code:
main.o: In function `Mesg::setPos(int, int)':
main.cpp:(.text+0x0): multiple definition of `Mesg::setPos(int, int)'
Mesg.o:Mesg.cpp:(.text+0x0): first defined here

Kann mir vielleicht jemand helfen? Eine Seite, die das Linken ausführlich erklärt, wäre event. auch hilfreich :)

Gruß
jojomp
 
Zuletzt bearbeitet:
Ok, das Problem konnte ich beheben. Es hat tatsächlich mit den Header-Dateien geklappt. Für alle, die ähnliche Probleme haben:

Eure Datei heißt "funktionen.cpp". Ihr schreibt alle Deklarationen (nicht Definitionen) in die Datei "funktionen.h". Alle #include - Anweisungen werden in unsere .h - Datei verschoben. Außerdem fügt ihr am Anfang der Datei folgende Anweisungen ein:
Code:
#ifndef FUNKTIONEN_H
#define FUNKTIONEN_H
und am Ende
Code:
#endif

Jetzt müsst ihr überall dort, wo ihr normalerweise "funktionen.cpp" benutzt, "funktionen.h" nehmen.

Wichtig: Später, beim Linken müsst ihr natürlich die .cpp Datei kompilieren:

Erst wird die Datei kompiliert:
Code:
g++ -c funktionen.cpp
Jetzt findet ihr im selben Verzeichnis die Datei "funktionen.o".

Dann wird die Datei in euer Projekt gelinkt:
Code:
g++ -o euer_projekt funktionen.o

Falls ich hier was falsches schreibe, bitte melden :)

Gruß jojomp
 
Und jetzt nochmal für die totalen c++ ****s (so wie mich :D) :

wie schaffe ich es z.B. eine gehen.o datei zu linken? (ich verwende Code::Blocks falls des was hilft :) )
 
Zurück