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
是否有人有我怎么能解决我的问题的想法?
“我得到了很多GTK失败消息”那些可能包含重要信息,否则程序员不会浪费他的时间写他们。因此,与我们分享,至少前10名左右。 – 2015-03-31 18:30:36
是的,当然,这里的消息: '(进程:7556):GTK的CRITICAL **:_gtk_style_cascade_get_for_screen:断言 'GDK_IS_SCREEN(屏幕)' failed' **只出现一次**: (进程:7556):GLib-GObject-警告**:无效的(NULL)指针实例' – 2015-03-31 18:37:34
在这里他们是在问题!感谢您的帮助:) – 2015-03-31 18:43:00