(Mysteriöses) Linkerproblem mit C++/gcc

03/01/2009 - 17:26 von Alexander Ulrich | Report spam
Hallo,

ich habe hier ein Programm das sich nicht linken làsst. Da mir gerade
die Ideen ausgehen und meine Ansàtze zunehmend aus raten und Voodoo
bestehen frage ich hier um Rat.

namespace spovnet {
namespace clio {
namespace core {

clio/core/CLIOCore.h:
[...]
class CLIOCore {
public:
CLIOCore();

void setOrder(CLIOCoreOrderPtr o, CLIONodeListener* listener);

void cancelOrder(OrderID oid);

virtual ~CLIOCore();
private:
[einige Methoden und Variablen, nichts virtuelles]
};
}}} // namespaces spovnet, clio, core

Alle Methoden, Konstruktoren und Destruktoren sind in der passenden Datei
implementiert.

Ein CLIOCore-Objekt wird an genau einer einzigen Stelle erzeugt:

base/core/Core.cpp:
[...]
Core::Core() {
basecomm = new BaseCommunication();
clioCore = new CLIOCore(); // Zeile 8
}
[...]

Soweit alles prima. Das Problem: Um CLIOCore als Basisklasse benutzen
zu können möchte ich setOrder/cancelOrder virtuell deklarieren:

virtual void setOrder(CLIOCoreOrderPtr o, CLIONodeListener* listener);
virtual void cancelOrder(OrderID oid);

Das führt dazu dass der Linker einen Fehler produziert:

[Umformatiert wg. Zeilenlànge]
g++-4.2 -g -o spovnet main.o
-L/home/ulricha/dev/spovnet_complete/lib/boost_1_35_0/build/lib
-L/home/ulricha/dev/spovnet_complete/lib/cryptlib_3_3_1
-L/home/ulricha/dev/spovnet_complete/lib/gmp_4_2_2/build/lib
-L/home/ulricha/dev/spovnet_complete/lib/irrlicht_1_4_0/lib/Linux
-L/home/ulricha/dev/spovnet_complete/lib/log4cxx_0_10_0/build/lib
-L/home/ulricha/dev/spovnet_complete/lib/xerces_2_8_0/build/lib
-lboost_thread -lpthread -lcl
/home/ulricha/dev/spovnet_complete/lib/gmp_4_2_2/build/lib/libgmp.so
-lIrrlicht -lGLU -lXrandr -lXext -lX11
/home/ulricha/dev/spovnet_complete/lib/log4cxx_0_10_0/build/lib/liblog4cxx.so
-lxerces-c -lboost_serialization -lboost_filesystem -lboost_system
-L/home/ulricha/dev/spovnet_complete/lib/poco-1.3.2-ssl/installation/lib
-lPocoFoundation applications/videostreaming/libvideostreaming.a
applications/planetpi4/libplanetpi4.a services/mcpo/libmcpo.a
services/eonson/libeonson.a services/pingpong/libpingpong.a
clio/libclio.a base/libbase.a common/libcommon.a sec/libsec.a
-Wl,--rpath
-Wl,/home/ulricha/dev/spovnet_complete/lib/gmp_4_2_2/build/lib
-Wl,--rpath
-Wl,/home/ulricha/dev/spovnet_complete/lib/log4cxx_0_10_0/build/lib
-Wl,--rpath
-Wl,/home/ulricha/dev/spovnet_complete/lib/gmp_4_2_2/build/lib
-Wl,--rpath
-Wl,/home/ulricha/dev/spovnet_complete/lib/log4cxx_0_10_0/build/lib
base/libbase.a(Core.o): In function `Core':
/home/ulricha/dev/spovnet_complete/src/base/core/Core.cpp:8: undefined
reference to `spovnet::clio::core::CLIOCore::CLIOCore()'
/home/ulricha/dev/spovnet_complete/src/base/core/Core.cpp:8: undefined
reference to `spovnet::clio::core::CLIOCore::CLIOCore()'
collect2: ld returned 1 exit status

Zusàtzlich mysteriös wird die Angelegenheit für mich da das Problem nur
auftritt wenn beide Methoden als virtual deklariert sind. Wenn nur eine
der beiden virtual ist (egal welche) linkt das ganze anstandslos. Ich dachte
zuerst an ein Problem in der Headerstruktur (die wunderbar chaotisch ist),
scheint aber nicht der Fall zu sein. Ausserdem sollten dadurch ja eher Compiler-
als Linkerfehler entstehen. Ein make clean hat keinen Effekt.

Wahrscheinlich liegt das Problem in meinem mangelhaften Verstàndnis
von C++ begründet. Allerdings haben da auch schon ein paar Leute
draufgeschaut die es etwas besser können.

Verwendet werden gcc 4.2.4 und autotools unter Debian unstable.

Irgendwelche Ideen?

Danke im Vorraus,
Alex
 

Lesen sie die antworten

#1 Christoph Bartoschek
04/01/2009 - 18:41 | Warnen spam
Hallo,

Die folgende Funktion wird nicht gefunden:

spovnet::clio::core::CLIOCore::CLIOCore()

Ist diese Methode in libbase.a und in CLIOCore.o enthalten?
Ist CLIOCore.o in libbase.a drin?

Ist irgendwas inline?

Christoph

Ähnliche fragen