vererbte Klasse aus dll exportieren
-
Hallo,
Ich habe eine dll, die die Klasse "System" durch das "SystemInterface" exportiert.
Soweit funktioniert das Beispiel.Jetzt will ich aber nicht nur eine einfache Klasse:
class SYSTEMSHARED_EXPORT System : public SystemInterface ...sondern eine Klasse, die von einem "SystemWrapper" beerbt wird also:
class SYSTEMSHARED_EXPORT System : public SystemInterface, public SystemWrapper ...wobei "SystemWrapper" schon ein paar - nicht virtuelle - Methoden definiert. (z.B. resetTime in diesem Testbeispiel)
Bei Linken bekomme ich "undefined reference to SystemWrapper::SystemWrapper()Ich weiss, dass ich mich besser in c++ Basics einlesen muesste weil das Problem wahrscheinlich leicht loesbar ist, aber ich komme einfach nicht drauf.
Kann mir jemand helfen?
Dankesystem.h
#ifndef SYSTEM_H #define SYSTEM_H #include "system_global.h" #include "systemInterface.h" #include "../Simulator/systemwrapper.h" #include <iostream> class SYSTEMSHARED_EXPORT System : public SystemInterface, public SystemWrapper { public: System(int startTime) : SystemWrapper(), t_(startTime) { std::cout << "System construct\n"; } ~System() { std::cout << "System destruct\n"; } void destroy(); int setTime(int t); int t_; }; extern "C" __declspec(dllexport) SystemInterface* __cdecl createSystem(int startTime=0) { return new System(startTime); } #endif // SYSTEM_Hsystem.cpp
#include "system.h" void System::destroy() { delete this; } int System::setTime(int t){ t_=t; std::cout << "time set: " << t_ << "\n"; return t_; }system_golbal.h
#ifndef SYSTEM_GLOBAL_H #define SYSTEM_GLOBAL_H #include <QtCore/qglobal.h> #if defined(SYSTEM_LIBRARY) # define SYSTEMSHARED_EXPORT Q_DECL_EXPORT #else # define SYSTEMSHARED_EXPORT Q_DECL_IMPORT #endif #endif // SYSTEM_GLOBAL_HsystemInterface.h
#ifndef SYSTEMINTERFACE_H #define SYSTEMINTERFACE_H class SystemInterface { public: virtual void destroy()=0; virtual int setTime(int t)=0; }; #endif // SYSTEMINTERFACE_HsystemWrapper.h
#ifndef SYSTEMWRAPPER_H #define SYSTEMWRAPPER_H class SystemWrapper { public: SystemWrapper(); void resetTime(); virtual int setTime(int t)=0; int t_; }; #endif // SYSTEMWRAPPER_HsystemWrapper.cpp
#include "systemwrapper.h" SystemWrapper::SystemWrapper() { } void SystemWrapper::resetTime() { set t_=0; }main.cpp
#include "../System/systemInterface.h" #include <iostream> #include <windows.h> using namespace std; typedef SystemInterface* (__cdecl *system_factory)(); int main() { HINSTANCE dll_handle = ::LoadLibrary(TEXT("../build-System/debug/System.dll")); if (!dll_handle) { cerr << "Unable to load DLL!\n"; return 1; } system_factory factory_func = reinterpret_cast<system_factory>( ::GetProcAddress(dll_handle, "createSystem")); if (!factory_func) { cerr << "Unable to load createSystem from DLL!\n"; ::FreeLibrary(dll_handle); return 1; } SystemInterface* instance = factory_func(); int t = instance->setTime(120); cout << "t = " << t << endl; instance->destroy(); ::FreeLibrary(dll_handle); return 0; }
-
Hast du vllt. einfach vergessen, die SystemWrapper bei deinem Projekt mitzulinken?
Welche IDE verwendest du denn (VS, QtCreator, ...)?Mir erscheint auch dein Klassendesign etwas eigenartig. Wäre es nicht besser, wenn SystemWrapper von SystemInterface abgeleitet wäre, so daß dann System nur direkt von SystemWrapper erbt?
-
Ich verwende Qt-Creator.
Du hast Recht, ich werde System nur SystemWrapper erben lassen.
Kannst du mir sagen wie ich in Qt-Creator dem Linker SystemWrapper mitgebe?
In jeden Fall, Danke fuer deine Hilfe. Ich weiss jetzt schon mehr wie vorher.QT -= gui TARGET = System TEMPLATE = lib DEFINES += SYSTEM_LIBRARY SOURCES += system.cpp HEADERS += system.h\ system_global.h \ systemInterface.h unix { target.path = /usr/lib INSTALLS += target }
-
Du hast die Sourcen noch nicht mal kompiliert:
SOURCES += system.cpp \ systemWrapper.cppUnd die main.cpp fehlt da ja auch noch, oder bindet man die im QtCreator anders ein?
-
Nein, das ist das .pro file fuer die dll.
Das main.cpp steht im .pro file vom eigentlichen Projekt.Egal, ich hab's inzwischen so gemacht wie du vorgeschlagen hast, bzw. SystemWrapper einfach mit SystemInterface verheiratet,
sodass es nur noch eine einfache Vererbung gibt.
Und schon laueft's!Vielen Dank nochmal.
kwurpi