Multiple Definition problem...

Benutzeravatar
_andreas
Windoof-User
Windoof-User
Beiträge: 37
Registriert: 13. Okt 2009 13:45
Kontaktdaten:

Multiple Definition problem...

Beitrag von _andreas »

Hi

Ich will mir eine P3utils Datei anlegen mit einer Klasse, die ein paar statische Funktionen besitzt um mir einige Probleme zu erleichtern, wie z.B. eine Funktion zum einfachen splitten von Strings anhand eines delimiters.

Soweit klappte das auch ganz gut, bis ich den Hinweis las, wir sollen alle Zusatzfunktionen in eine Datei ausgliedern und diese in die CMakeList.txt mit reinschreiben.
Nachdem ich das befolgte, bekomme ich nun den Compilerfehler, der von einer doppelten Definition spricht, obwohl das nicht sein kann. HIer mal compilerausgabe und schematisch die cpp dateien, was da vor sich geht:

Code: Alles auswählen

~/Dokumente/c/p3/build$ make
Scanning dependencies of target Praktikum3
[ 50%] Building CXX object CMakeFiles/Praktikum3.dir/p3utils.cpp.o
[100%] Building CXX object CMakeFiles/Praktikum3.dir/pr3.cpp.o
In file included from /home/user/Dokumente/c/p3/pr3.cpp:29:
Linking CXX executable Praktikum3
CMakeFiles/Praktikum3.dir/pr3.cpp.o: In function `P3utils::str_xxsplit(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
/home/user/Dokumente/c/p3/p3utils.cpp:16: multiple definition of `P3utils::str_xxsplit(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
CMakeFiles/Praktikum3.dir/p3utils.cpp.o:/home/user/Dokumente/c/p3/p3utils.cpp:16: first defined here
collect2: ld returned 1 exit status
make[2]: *** [Praktikum3] Fehler 1
make[1]: *** [CMakeFiles/Praktikum3.dir/all] Fehler 2
make: *** [all] Fehler 2
Interessant ist diese Stelle:
multiple definition of `P3utils::str_xxsplit( [...] p3utils.cpp:16: first defined here
Allerdings bekomme ich nicht raus wo die funktion angeblich noch definiert sein soll? Hab ich da einen Syntaxfehler? Hier mal die Dateien ohne content:

p3utils.cpp:

Code: Alles auswählen

#ifndef P3UTILS_H
#define P3UTILS_H

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <string>

using namespace std;

class P3utils {
	public:
		static vector<string> str_xxsplit (const string &buffer, const string &delimiter);
};

vector<string> P3utils::str_xxsplit (const string &buffer, const string &delimiter) {
	// Split lines to vector
	vector<string> lines;
..
..
..
	return lines;	
}

#endif // P3UTILS_H
Hier der Part wo ich diese in der shapereader.h include und benutze:

Code: Alles auswählen

#ifndef SHAPEREADER_H
#define SHAPEREADER_H

#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <vector>
#include <string>

#include "shapes.h"
#include "p3utils.cpp"

class Shapereader {
...
...
...
	std::string sbuffer = std::string(buffer);
	std::vector<std::string> lines = P3utils::str_xxsplit(sbuffer, "\n");

...
...
...
Wo liegt das Problem?

Wenn ich die Datei aus der CMakeListe rauslasse kompiliert er. Kann ich das dann weglassen oder müssen wir das so angeben?

Drno
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 236
Registriert: 10. Feb 2005 20:16

Re: Multiple Definition problem...

Beitrag von Drno »

Man vermeidet es *.cpp Datein zu includen. Wenn man eine Klasse anlegt, erzeugt man eine .h Datei mit den Deklarationen und eine *.cpp Datei mit den Definitionen. Somit müsstest du in shapereader nur die p3utils.h includen und vermeidest solche multiple definition Fehlermeldungen. Wie du schreibst, hast du ja p3utils.cpp schon in CMakeList.txt eingetragen. Durch dein direktes includen von p3utils.cpp kommst es zu dieser doppelten Definition.
Programming today is a race between software engineers striving to build bigger and better idiot proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.

Antworten

Zurück zu „Archiv“