Общая библиотека и функции-члены

Я столкнулся с небольшой проблемой в C ++.

Итак, у меня есть игра, что-то вроде Snake, и я хочу сделать это с тремя различными графическими библиотеками. (например, 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

(Я просто поместил DisplaySDL.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 () работает отлично, она загружает библиотеку, о которой я говорю, НО только тогда, когда у меня нет какого-либо члена функции ни в одной из моих графических библиотек.
Если я удаляю функцию «boucle ()» из моего кода, она прекрасно работает, как показано ниже:

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

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

yanis@b3nd3r:~/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();

Функция Boucle () заключается только в печати фразы …

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector