簡體   English   中英

共享庫和成員函數

[英]Shared library and member functions

我在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

否則,這就是我嘗試加載lib時得到的結果:

yanis@b3nd3r:~/Projets/C++/nibbler$ ./nibbler 20 20 ./libsdl.so 
./libsdl.so: undefined symbol: _ZTI8IDisplay
./nibbler: undefined symbol: createDisplay
Segmentation Fault

有什么幫助嗎? :)

好吧,我設法使其正常工作……“ = 0;” 我的界面中缺少“ Boucle()”函數。

但是我面臨另一個問題...我可以調用我的boucle()函數,但是每當執行此操作時,我都會遇到段錯誤...

這是我使用的代碼:

    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()函數僅包含在打印短語時...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM