GTK+3 编译错误"找不到信号处理程序",您是否使用 -rdynamic 进行了编译?

GTK+3 compile error "Could not find signal handler `` Did you compile with -rdynamic?

本文关键字:编译 -rdynamic 找不到 错误 信号处理 程序 GTK+3 是否      更新时间:2023-10-16

我正在用Glade和GTK+3制作一个GUI。我遵循了许多教程,阅读了许多论坛帖子,但我仍然可以摆脱"Gtk-WARNING **: 14:50:06.794:找不到信号处理程序'on_window_main_destroy'。 您是否使用-rdynamic?"我拥有的每个信号的警告进行编译。请帮忙。这个问题真的要了我的命!

我在 Glade 中制作了一个简单的 GUI。它由主窗口,固定网格,两个刻度和两个连接到刻度的调整组成。我已经将信号连接到主窗口"销毁"on_window_main_destroy"以及调整"值更改-> on_adjustment_scale_exposure_value_changed"和"值更改-> on_adjustment_scale_gain_value_changed"。

然后我使用 geany 编写了代码。无论我尝试什么,每次运行程序时,我都会收到所有信号的上述错误消息。

在 Glade 中,我尝试使用普通的保存屁股并保存屁股"构建器"文件。没有区别。

我尝试过许多不同的 g++ 和 gcc 命令,没有区别。

格莱德代码:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkAdjustment" id="adjustment_scale_exposure">
<property name="lower">1</property>
<property name="upper">1000</property>
<property name="value">10</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
<signal name="value-changed" handler="on_adjustment_scale_exposure_value_changed" swapped="no"/>
</object>
<object class="GtkAdjustment" id="adjustment_scale_gain">
<property name="lower">1</property>
<property name="upper">20</property>
<property name="value">1</property>
<property name="step_increment">1</property>
<property name="page_increment">10</property>
<signal name="value-changed" handler="on_adjustment_scale_gain_value_changed" swapped="no"/>
</object>
<object class="GtkWindow" id="window_main">
<property name="width_request">1024</property>
<property name="height_request">600</property>
<property name="can_focus">False</property>
<property name="border_width">5</property>
<signal name="destroy" handler="on_window_main_destroy" swapped="no"/>
<child>
<placeholder/>
</child>
<child>
<object class="GtkFixed">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkScale" id="scale_exposure">
<property name="width_request">30</property>
<property name="height_request">600</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="orientation">vertical</property>
<property name="adjustment">adjustment_scale_exposure</property>
<property name="inverted">True</property>
<property name="round_digits">1</property>
<property name="digits">0</property>
<property name="value_pos">bottom</property>
</object>
</child>
<child>
<object class="GtkScale" id="scale_gain">
<property name="width_request">30</property>
<property name="height_request">600</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="orientation">vertical</property>
<property name="adjustment">adjustment_scale_gain</property>
<property name="inverted">True</property>
<property name="round_digits">1</property>
<property name="value_pos">bottom</property>
</object>
<packing>
<property name="x">30</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

编写的代码:

#include "gtk/gtk.h"
GtkWidget *g_scale_exposure;
GtkAdjustment *g_adjustment_scale_exposure;
GtkWidget *g_scale_gain;
GtkAdjustment *g_adjustment_scale_gain;
GtkWidget *g_lbl_exposure;
GtkWidget *g_lbl_gain;
int main (int argc, char* argv[]){
GtkBuilder *builder;
GtkWidget *window;
gtk_init(&argc, &argv);
builder = gtk_builder_new();
gtk_builder_add_from_file(builder, "main.glade", NULL);
window = GTK_WIDGET(gtk_builder_get_object(builder, "window_main"));
gtk_builder_connect_signals(builder, NULL);
g_scale_exposure = GTK_WIDGET(gtk_builder_get_object(builder, "scale_exposure"));
g_scale_gain = GTK_WIDGET(gtk_builder_get_object(builder, "scale_gain"));
g_adjustment_scale_exposure = GTK_ADJUSTMENT(gtk_builder_get_object(builder, "adjustment_scale_exposure"));
g_adjustment_scale_gain = GTK_ADJUSTMENT(gtk_builder_get_object(builder, "adjustment_scale_gain"));
g_lbl_exposure = GTK_WIDGET(gtk_builder_get_object(builder, "lbl_exposure"));
g_lbl_gain = GTK_WIDGET(gtk_builder_get_object(builder, "lbl_gain"));
g_object_unref(builder);
gtk_widget_show(window);
gtk_main();
return 0;
}
void on_window_main_destroy(){
gtk_main_quit();
}
void on_adjustment_scale_exposure_value_changed(GtkAdjustment *adjustment_scale_exposure, gpointer data){
int scaleValue = gtk_adjustment_get_value(GTK_ADJUSTMENT(g_adjustment_scale_exposure));
printf("moi, %dn", scaleValue);
}
void on_adjustment_scale_gain_value_changed(GtkAdjustment *adjustment_scale_gain, gpointer data){
float scaleValue = gtk_adjustment_get_value(GTK_ADJUSTMENT(g_adjustment_scale_gain));
printf("moi2, %fn", scaleValue);
}

G++ 代码:

g++ -rdynamic -Wall  normiApiTestiGlade2.cpp -o runme `pkg-config --cflags --libs gtk+-3.0 gmodule-2.0`

预期结果是在连接信号的情况下运行 GUI。现在 GUI 启动,我可以移动滑块,但没有任何变化(GUI 除外(。

警告: (runme:18098(: gtk-警告 **: 15:09:26.660: 找不到信号处理程序"on_window_main_destroy"。 您是否使用 -rdynamic 编译?

(runme:18098(: gtk-警告 **: 15:09:26.660: 找不到信号处理程序"on_adjustment_scale_gain_value_changed"。 您是否使用 -rdynamic 编译?

(runme:18098(: Gtk-警告 **: 15:09:26.660: 找不到信号处理程序"on_adjustment_scale_exposure_value_changed"。 您是否使用 -rdynamic 编译?

gtk_builder_connect_signals拥有您需要的所有信息。

在未明确添加符号的情况下;它使用了GModule的内省功能...要查看应用程序的符号表...

如果您依赖 GModule支持来查找符号表中的回调,则应注意以下详细信息:

编译适用于 Windows 的应用程序时,必须使用 G_MODULE_EXPORT 声明信号回调,否则它们将不会放在符号表中。在 Linux 和 Unices 上,这不是必需的;应用程序应该使用 -Wl,--export-dynamic CFLAGS 进行编译,并与 gmodule-export-2.0 链接。

您必须将-Wl,--export-dynamic(原文如此(传递给编译器。