首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用dlopen动态加载gtkmm对象

用dlopen动态加载gtkmm对象
EN

Stack Overflow用户
提问于 2015-03-31 18:28:26
回答 1查看 314关注 0票数 2

我必须动态地使用使用Gtkmm的库。不幸的是,我甚至没有设法以这种方式打开一个窗口,我也不明白为什么。由于技术上的限制,我必须使用的功能是dl*系列。以下是我到目前为止尝试过的:

我的编译行:

库的

代码语言:javascript
复制
g++ gtkmm.cpp -shared -fPIC -o lib.so `pkg-config gtkmm-3.0 --cflags --libs

用于

代码语言:javascript
复制
g++ main.cpp -ldl

档案:main.cpp

代码语言:javascript
复制
#include "INibbler.hpp"
#include <dlfcn.h>
#include <cstdlib>
#include <iostream>

typedef INibbler *(*fPtr)(int x, int y);

int main(int ac, char **av)
{
  void  *handle;
  fPtr  ptr;

  handle = dlopen("./lib.so", RTLD_LAZY);
  if (handle != NULL)
    {
      ptr = reinterpret_cast<fPtr>(dlsym(handle, "returnInstance"));
      INibbler *test = reinterpret_cast<INibbler *>((*ptr)(700, 500));
      test->loopGame(ac, av);
    }
}

档案:gtkmm.cpp

代码语言:javascript
复制
LibGtkmm::LibGtkmm(int x, int y)
{
  (void)x;
  (void)y;
  this->set_default_size(100, 100);
}

LibGtkmm::~LibGtkmm()
{

}

void LibGtkmm::loopGame(int ac, char **av)
{
  Glib::RefPtr<Gtk::Application> app
    = Gtk::Application::create(ac,av, "org.gtkmm", Gio::APPLICATION_HANDLES_OPEN);

  app->run(*this);
}

extern "C"
{
  INibbler *returnInstance(int x, int y)
  {
    std::cout << "hey" << std::endl;
    return (new LibGtkmm(x, y));
  }
}

档案:gtkmm.hpp

代码语言:javascript
复制
#ifndef GTKMM_H_
#define GTKMM_H_

#include <gtkmm.h>
#include "../INibbler.hpp"

class   LibGtkmm : public INibbler, public Gtk::Window
{
private:
public:
  LibGtkmm(int x, int y);
  virtual ~LibGtkmm();
  virtual void loopGame(int ac, char **av);
};

#endif  // !GTKMM_H_

文件:INibbler.hpp

代码语言:javascript
复制
#ifndef INIBBLER_HPP_
# define INIBBLER_HPP_

class   INibbler
{
public:
  virtual void  loopGame(int ac, char **av) = 0;
};

#endif /* !INIBBLER_HPP_ */

当我调用app->run时,窗口本身不会打开,我收到了很多GTK失败消息.表示指针在某种程度上是空的。以下是最值得注意的:

代码语言:javascript
复制
(process:7556): Gtk-CRITICAL **: gtk_settings_get_for_screen: assertion 'GDK_IS_SCREEN (screen)' failed

(process:7556): GLib-GObject-WARNING **: invalid (NULL) pointer instance

(process:7556): GLib-GObject-CRITICAL **: g_signal_connect_object: assertion 'G_TYPE_CHECK_INSTANCE (instance)' failed

有人知道我如何解决我的问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-24 20:35:19

问题:您没有Gtk::Main。

解决方案:创建一个Gtk::Main。你需要这个:

代码语言:javascript
复制
Gtk::Main main(argc, argv);
main.run();

为了避免Gtkmm抓狂,请尽快创建Gtk::Main。初始化完所有内容后,调用main.run()。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29375831

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档