2016-05-18 2 views
0

私はGTK +でのC++ GUIプログラミングには新しく、コンパイルと実行時にボタンが動作するようにシグナルハンドラを取得することに問題があります。次の警告が表示されます。私が何かを間違ってやっているのか何かを逃しているのか誰にも分かりますか(C++)Gtk-WARNING **:シグナルハンドラが見つかりませんでした。 -rdynamicでコンパイルしましたか?

(Project Thoth:4359):Gtk-WARNING **:シグナルハンドラ「on_login_clicked」が見つかりませんでした。 -rdynamicでコンパイルしましたか?

これは私がすべての助けを事前に以下のフラグ

g++ -o "Project Thoth" main.cpp $(pkg-config --cflags --libs gtk+-3.0 gmodule-2.0) 

感謝を使用しコンパイルするため

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.18.3 --> 
<interface> 
    <requires lib="gtk+" version="3.0"/> 
    <object class="GtkApplicationWindow" id="Login"> 
    <property name="can_focus">False</property> 
    <property name="window_position">center</property> 
    <property name="default_width">400</property> 
    <property name="default_height">300</property> 
    <signal name="destroy" handler="on_window_destroy" swapped="no"/> 
    <child> 
     <object class="GtkLayout" id="layout1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <child> 
      <object class="GtkLabel" id="Label"> 
      <property name="width_request">100</property> 
      <property name="height_request">80</property> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">Project Thoth 
</property> 
      <property name="angle">0.089999999999999997</property> 
      <attributes> 
       <attribute name="weight" value="bold"/> 
      </attributes> 
      </object> 
      <packing> 
      <property name="x">156</property> 
      <property name="y">14</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkEntry" id="user1"> 
      <property name="width_request">166</property> 
      <property name="height_request">80</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      </object> 
      <packing> 
      <property name="x">128</property> 
      <property name="y">72</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkLabel" id="label1"> 
      <property name="width_request">100</property> 
      <property name="height_request">80</property> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">Username: 
</property> 
      </object> 
      <packing> 
      <property name="x">121</property> 
      <property name="y">52</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkEntry" id="pass"> 
      <property name="width_request">166</property> 
      <property name="height_request">84</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      </object> 
      <packing> 
      <property name="x">129</property> 
      <property name="y">130</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkLabel" id="label3"> 
      <property name="width_request">100</property> 
      <property name="height_request">80</property> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">Password: 

</property> 
      </object> 
      <packing> 
      <property name="x">117</property> 
      <property name="y">123</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkButton" id="button1"> 
      <property name="label" translatable="yes">Login</property> 
      <property name="width_request">70</property> 
      <property name="height_request">29</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      <property name="receives_default">True</property> 
      <property name="relief">half</property> 
      <signal name="clicked" handler="on_login_clicked" swapped="no"/> 
      </object> 
      <packing> 
      <property name="x">171</property> 
      <property name="y">191</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkLabel" id="label2"> 
      <property name="width_request">105</property> 
      <property name="height_request">35</property> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">save info login ?</property> 
      </object> 
      <packing> 
      <property name="x">154</property> 
      <property name="y">227</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkSwitch" id="switch1"> 
      <property name="width_request">74</property> 
      <property name="height_request">23</property> 
      <property name="visible">True</property> 
      <property name="can_focus">True</property> 
      </object> 
      <packing> 
      <property name="x">166</property> 
      <property name="y">263</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

も私のCPPファイル

#include <cstdlib> 
#include <cstdio> 
#include <string> 
#include <gtk/gtk.h> 
#include <iostream> 
extern "C" 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
GtkEntry *e1;//textbox1 
GtkEntry *e2;//textbox2 
GtkEntry *e3;//textbox3 

GtkBuilder *gtkBuilder; 
GtkWidget *window; 

gtk_init(&argc, &argv); 

gtkBuilder = gtk_builder_new(); 
gtk_builder_add_from_file(gtkBuilder, "Unsaved 1.glade", NULL); 
window = GTK_WIDGET(gtk_builder_get_object(gtkBuilder, "Login")); 

gtk_builder_connect_signals(gtkBuilder, window); 

g_object_unref(G_OBJECT(gtkBuilder)); 
gtk_widget_show(window); 
gtk_main(); 
cout << "Login window loaded"; 
return 0; 
} 

G_MODULE_EXPORT void on_login_clicked() 
{ 
printf("Request Detected\n"); 
GtkBuilder *gtkBuilder; 
GtkWidget *window; 

gtkBuilder = gtk_builder_new(); 
gtk_builder_add_from_file(gtkBuilder, "Unsaved 1.glade", NULL); 

GtkEntry *e1; 
GtkEntry *e2; 
e1 = GTK_ENTRY(gtk_builder_get_object(gtkBuilder, "user1")); 
e2 = GTK_ENTRY(gtk_builder_get_object(gtkBuilder, "pass")); 
gtk_builder_connect_signals(gtkBuilder, e1); 
const char *home; 
home = gtk_entry_get_text(e1); 
cout << home; 
} 

と私の空き地ファイルです。私は強くあなたの実行可能ファイル名にスペースを避けることをお勧めします、ところで

g++ -rdynamic -o Project_Thoth -Wall -g main.cpp \ 
    $(pkg-config --cflags --libs gtk+-3.0 gmodule-2.0) 

:そうと、あなたのコードをコンパイル-rdynamicしてコンパイルする(実際にリンク):

答えて

0

メッセージは良い提案を与えています。従ってProject_Thoth"Project Thoth"ではありません。また、(-Wall少なくとも、おそらくまたを加えて-Wextra)とデバッグ情報(-g)を要求することを忘れないでください。これは特に、デバッガgdbデバッガでプログラムをデバッグするのに役立ちます(またはメモリリークをvalgrind)。

ベンチマーク目的でプログラムをデバッグしたら、コンパイラに最適化を依頼することがあります(したがって、-O2を追加してください)。

ところで、本当にGTKをC++で使うのであれば、gtkmmを考えてみてください。しかし、普通のC99でGTKプログラムをコーディングすることができます(したがって、coutはありませんが、printfはありません)。また、C++が重要であれば、Qt(別のウィジェット・ツールキット、C++)に切り替えることも考えられます。

GTK(gtkmmではなく)でC++でコーディングする場合は、extern "C"すべて GTK関連のコードであるとよりよく宣言してください。

+0

は異なるコンパイルコードを試しましたが、同じ結果が出ました。 Imは最後の手段としてQtを保存しようとしていますが、もし私がgtkmmに移動することができれば、私の問題を解決することができます。 –

+0

おそらく、 '-o Project_Thoth'の前に' -rdynamic'が最初に与えられるべきです。ところで、C言​​語のみでコード化すれば(あなたのものを含めて、 'printf'、' cout << ')、コンパイル時間はC++コードがゆっくりコンパイルされるので速くなります。 –

+0

確かに、私はちょうどCを使っているかもしれません。お手伝いありがとう。 –

関連する問題