2015-03-31 26 views
2

我必须动态地使用我的库,它使用Gtkmm。不幸的是,我甚至没有设法以这种方式打开窗户,我不明白为什么。由于技术限制,我必须使用的功能是dl *系列。 这里是我到目前为止已经试过:用dlopen动态加载gtkmm对象

我的编译行:

为图书馆:

g++ gtkmm.cpp -shared -fPIC -o lib.so `pkg-config gtkmm-3.0 --cflags --libs 

主要

g++ main.cpp -ldl 

文件: main.cpp

#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

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

#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

#ifndef INIBBLER_HPP_ 
# define INIBBLER_HPP_ 

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

#endif /* !INIBBLER_HPP_ */ 

当我打电话给app->run时,窗口没有打开,我得到了很多GTK失败消息......告诉指针是NULL。 这里是最显着的:

(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 

是否有人有我怎么能解决我的问题的想法?

+0

“我得到了很多GTK失败消息”那些可能包含重要信息,否则程序员不会浪费他的时间写他们。因此,与我们分享,至少前10名左右。 – 2015-03-31 18:30:36

+0

是的,当然,这里的消息: '(进程:7556):GTK的CRITICAL **:_gtk_style_cascade_get_for_screen:断言 'GDK_IS_SCREEN(屏幕)' failed' **只出现一次**: (进程:7556):GLib-GObject-警告**:无效的(NULL)指针实例' – 2015-03-31 18:37:34

+0

在这里他们是在问题!感谢您的帮助:) – 2015-03-31 18:43:00

回答

2

问题:您没有Gtk :: Main。

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

Gtk::Main main(argc, argv); 
main.run(); 

为了避免Gtkmm吓坏了,尽快创建Gtk :: Main。调用main.run(),一旦你初始化了一切。

相关问题