Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML] 'undefined reference' do funkcji wirtualnych i WinMain

Ostatnio zmodyfikowano 2014-01-17 19:10
Autor Wiadomość
kubawal
Temat założony przez niniejszego użytkownika
[SFML] 'undefined reference' do funkcji wirtualnych i WinMain
» 2014-01-17 18:40:37
Witam!

Piszą sobie obiektowego frameworka mocno wykorzystującego obiektowość, i przy linkowaniu wyskakują 'undefined reference' do funkcji wirtualnych i WinMain'a.
C/C++
class Object
{
    virtual b2Shape * createB2Shape( const ObjectDef * def ) = 0; // każdy obiekt musi zdefiniować swój kształt
    virtual void * createSFObj( const ObjectDef * def ) = 0; // i obiekt w SF
    //...
};

Object::Object( /*...*/ )
{
    //...
    b2FixtureDef fixDef;
    fixDef.shape = createB2Shape( def ); // tutaj jest 1. undefined reference
   
    //...
   
    // każda klasa derywowana musi obsługiwać swój system rysowania
    // i ustawić środek i pozycje obiektu
    objSF = createSFObj( def ); // a tutaj 2.
}

// a tutaj są klasy derywujące:

class ShapeObject
    : public Object
{
   
    virtual b2Shape * createB2Shape( const ObjectDef * def ) = 0; // ShapeObject nie wie nic o kształcie derywujących go obiektów
    virtual void * createSFObj( const ObjectDef * def ) { return createDrawableShape(( const ShapeObjectDef * ) def ); } // ograniczenie: każda klasa dziedzicząca ShapeObject może za swój kształt uznawać tylko obiekt dziedziczący po sf::Shape
    virtual Shape * createDrawableShape( const ShapeObjectDef * def ) = 0; // każda dziedzicząca klasa ustawia parametry kształtu
    //...
};

class RectangleObject
    : public ShapeObject
{
    virtual Shape * createDrawableShape( const ShapeObjectDef * def ); // przeciążenie wymaganych funkcji czysto wirtualnych
    virtual b2Shape * createB2Shape( const ObjectDef * def );
    //...
};

Błędy(tylko linkowanie):

debug/Object.o: In function `ZN2kp6ObjectC2EPNS_8GameBaseEPNS_9ObjectDefENS0_4TypeE':
C:\Kuba(D)\Programy\qt\build-Box2d-test1-Desktop_Qt_5_1_1_MinGW_32bit-Debug/../Box2d-Test1/Object.cpp:17: undefined reference to `kp::Object::createB2Shape(kp::ObjectDef const*)'
C:\Kuba(D)\Programy\qt\build-Box2d-test1-Desktop_Qt_5_1_1_MinGW_32bit-Debug/../Box2d-Test1/Object.cpp:26: undefined reference to `kp::Object::createSFObj(kp::ObjectDef const*)'
c:/biblioteki/qt-5.1.1/tools/mingw48_32/bin/../lib/gcc/i686-w64-mingw32/4.8.0/../../../../i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x39): undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
Zauważcie, że nie znajduje także WinMain(), chociaż dołączyłem -lsfml-main-d.

Polecenia kompilatora(tylko linkowanie):

g++ -Wl,-subsystem,console -mthreads -o debug\Box2d-Test1.exe debug/ShapeObject.o debug/RectangleObject.o debug/Object.o debug/GameBase.o debug/main.o  -luser32 -LC:\Biblioteki\SFML-src\build\lib -lsfml-audio-d -lsfml-graphics-d -lsfml-main-d -lsfml-network-d -lsfml-window-d -lsfml-system-d -LC:\Biblioteki\box2d-2.3\qt-build\Box2D -lBox2d

PS: Moje środowisko:
MinGW 4.8
SFML 2.1 src-build


P-102386
Monika90
» 2014-01-17 18:53:18
C/C++
fixDef.shape = createB2Shape( def ); // tutaj jest 1. undefined reference
Wewnatrz konstruktorów mechanizm f. wirtualnych nie działa, tzn. wywołana będzie wersja z klasy Object która nie jet zdefiniowana.
P-102390
kubawal
Temat założony przez niniejszego użytkownika
» 2014-01-17 18:56:14
Czyli muszę napisać funkcję inicjalizującą w klasie Object, która musi być wywoływana na końcu konstruktora każdej klasy dziedziczącej?
P-102391
kubawal
Temat założony przez niniejszego użytkownika
» 2014-01-17 19:10:24
Działa. Tylko co z tym undefined reference'm do WinMain()'a?
P-102393
« 1 »
  Strona 1 z 1