2013-03-20 2 views
0

Я столкнулся с небольшой проблемой в C++.Общая библиотека и функции-члены

Итак, у меня есть игра, своего рода Змея, и я хочу сделать это с помощью трех разных графических библиотек. (например, libsdl.so, libndk.so и libQt.so).

У меня есть следующие классы:

DisplaySDL.hh:

#ifndef DISPLAYSDL_HH__ 
# define DISPLAYSDL_HH__ 

#include "IDisplay.hh" 

class DisplaySdl : public IDisplay 
{ 
public: 
    DisplaySdl(); 
    ~DisplaySdl();                                                   
    void   Boucle(Core &core); 
}; 

#endif 

DisplaySDL.cpp:

#include <iostream> 
#include "DisplaySdl.hh" 

extern "C" 
{ 
    IDisplay*  createDisplay() 
    { 
    return new DisplaySdl(); 
    } 
} 

DisplaySdl::DisplaySdl() 
{ 
    std::cout << "SDL Loaded" << std::endl; 
} 

DisplaySdl::~DisplaySdl() 
{ 

} 

void   DisplaySdl::Boucle(Core &core) 
{ 
    std::cout << "this is just a test" << std::endl; 
} 

и у меня есть интерфейс "IDisplay":

#ifndef IDISPLAY_HH__ 
# define IDISPLAY_HH__ 

#include "../Core/Core.hh" 

class IDisplay 
{ 
public: 
    virtual ~IDisplay() {}                        
     // virtual void dispSnake(Snake snake) = 0;                                                 
    // virtual void dispBlock(Block block) = 0;                                                 
    // virtual void dispMap(Map map) = 0;                                                   
    virtual void Boucle(Core &core); 

    }; 

#endif 

(Я просто положил Disp laySDL.hh и DisplaySDL.cpp, так как другие библиотеки имеют одинаковый шаблон/функции)

И вот код, который загружает разные библиотеки и создает объект IDisplay *. :

IDisplay* LibGestionnary::loadLibFromName(const std::string &libname) 
{ 
    IDisplay* (*external_creator)(); 
    void* dlhandle; 

    dlhandle = dlopen(libname.c_str(), RTLD_LAZY); 
    if (dlhandle == NULL) 
    std::cout << dlerror() << std::endl; 
    external_creator = reinterpret_cast<IDisplay* (*)()>(dlsym(dlhandle, "createDisplay")); 
    if (external_creator == NULL) 
    std::cout << dlerror() << std::endl; 
    IDisplay* Display = external_creator(); 
    dlclose(dlhandle); 
    return (Display); 
} 

Дело в том, что моя функция loadLibFromName() работает прекрасно, он загружает библиотеку, я говорю это, но только тогда, когда у меня нет никакого члена функции в любом из моего графического Lib. Если удалить «букле()» функции из моего кода, он прекрасно работает, как показано ниже:

./nibbler 20 20 ./libsdl.so 
SDL Loaded 

В противном случае, это то, что я получаю, когда я пытаюсь загрузить Либерал:

[email protected]:~/Projets/C++/nibbler$ ./nibbler 20 20 ./libsdl.so 
./libsdl.so: undefined symbol: _ZTI8IDisplay 
./nibbler: undefined symbol: createDisplay 
Segmentation Fault 

Любая помощь ? :)

ответ

0

Ну, мне удалось заставить его работать ... "= 0;" отсутствовал в моем интерфейсе для функции «Boucle()».

Но я столкнулся с другой проблемой ... Я могу назвать мою boucle() функцию, но всякий раз, когда я это делаю, я получаю Segfault ...

Вот код, я использую:

int main(int argc, char **argv) 
    { 
     IDisplay    *display; 
     display = gestionnary.loadLibFromName(std::string(argv[3])); 
     display->Boucle(); 
    } 

И GDB говорит мне, что:

функция
Program received signal SIGSEGV, Segmentation fault. 
0x000000000040b325 in main (argc=4, argv=0x7fffffffe538, env=0x7fffffffe560) at Core/main.cpp:44 
44 display->Boucle(); 

Букле() состоит в том, только на печать фразы ...

Смежные вопросы