Я столкнулся с небольшой проблемой в 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
Любая помощь ? :)