[Linker Warning] Public symbol '_conout' defined in both module

Atlanx

Mitglied
Hallo, ich hab hier ein kleines Problem mit meinem Linker.

Ich hab mir eine Streamklasse geschrieben um damit von meinem (GUI)Programm Debugmeldungen in einer Konsole ausgeben zu können.

Jetzt bekomme ich aber einen Linkerfehler, wenn ich das conout-Objekt in meinem Hauptprogramm(Unit1.cpp) und gleichzeitig in meiner Klassendatei(igl3d.cpp) verwende.
Code:
[Linker Warning] Public symbol '_conout' defined in both module D:\...\UNIT1.OBJ and D:\...\IGL3D.OBJ

Ich dachte eigentlich, dass sich das mit 'extern' lösen liese, aber anscheinend nicht.

Aktuell sieht es so aus:

Unit1.cpp
Code:
#include "consolestream.h"  // for console
consoleStream conout(0); // defined in Unit1.cpp

IGL3D.cpp
Code:
#include "consolestream.h"  // for console
extern consoleStream conout(0); // defined in Unit1.cpp

Damit kann ich in beiden Dateien mit
Code:
conout << "test" << endl;

etwas in die Konsole schreiben.

p.s. Die Headerdatei von consolestream.h ist natürlich mit #ifdef vor mehrfacheinbindung geschützt:
Code:
#ifndef __CONSOLE_STREAM__
#define __CONSOLE_STREAM__

#include <vcl.h>
#pragma hdrstop

#include <streambuf>
#include <ostream>
#include <string>

// stream functions
std::ostream& operator << (std::ostream& ostr, std::string& sstr);

// consoleStreambuf
class consoleStreambuf : public std::streambuf {
public:
	consoleStreambuf(int iBuffersize=255);
	virtual ~consoleStreambuf();

private:
	void WriteCharToConsole(int);
	void WriteToConsole();
	void DeleteConsole();
	void CreateConsole();
	HANDLE hConsoleOut;
	char* pReserve;

protected:
	int_type overflow(int_type);
	int_type sync();
};

// consoleStream
class consoleStream : public std::ostream {
public:
	consoleStream();
	consoleStream(int);
	virtual ~consoleStream();
};
#endif
 
Hi.
Atlanx hat gesagt.:
Code:
#include "consolestream.h"  // for console
extern consoleStream conout(0); // defined in Unit1.cpp
Hier initialisierst du die Variable conout (du rufst den Konstruktor auf) obwohl du gleichzeitig die Variable als extern deklariert hast. Das ist dann natürlich Quark.

Leider warnt der Borland Compiler nicht vor diesem Konstrukt.

Gruß
 
Zurück