gpt4 book ai didi

c++ - 使用 dlopen 动态加载 gtkmm 对象

转载 作者:搜寻专家 更新时间:2023-10-31 02:23:22 25 4
gpt4 key购买 nike

我必须动态地使用我的使用 Gtkmm 的库。不幸的是,我什至无法以这种方式打开一个窗口,而且我不明白为什么。由于技术限制,我必须使用的功能是 dl* 家族。到目前为止,这是我尝试过的:

我的编译行:

图书馆:

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

对于主要:

g++ main.cpp -ldl

文件:ma​​in.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::Main。

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

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

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

关于c++ - 使用 dlopen 动态加载 gtkmm 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29375831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com