2016-05-20 20 views
0

私はgtk(またはこの場合はgtkmm)で練習しています。私はまったく新しく、私は比較的新しいC++です。ウィンドウを開いてウィジェットをいくつか入れてもらえる作業プログラムがありましたが、今はボタンにアクションを追加しようとしていますが、これはうまくいきません。mainの関数をC++のほかのファイルから呼び出す方法は?

main.cc:

#include <iostream> 
    #include "buttons.h" 
    #include <gtkmm/application.h> 

    void printLine() 
    { 
     std::cout<<"you pressed the button"<<std::endl; 
    } 

    int main(int argc, char *argv[]) 
    { 
     Glib::RefPtr<Gtk::Application> app = 
     Gtk::Application::create(argc, argv, 
     "org.gtkmm.examples.base"); 

     Buttons buttons; 


     return app->run(buttons); 

    } 

buttons.h:

#ifndef GTKMM_EXAMPLE_BUTTONS_H 
    #define GTKMM_EXAMPLE_BUTTONS_H 

    #include <gtkmm/window.h> 
    #include <gtkmm/button.h> 
    #include <gtkmm/box.h> 

    class Buttons : public Gtk::Window 
    { 
    public: 
     Buttons(); 

     virtual ~Buttons(); 

    protected: 
     //Signal handlers: 
     void on_button_clicked(); 

     //Child widgets: 
     Gtk::Button m_button; 
     Gtk::Box buttonBox; 
    }; 

    #endif //GTKMM_EXAMPLE_BUTTONS_H 

buttons.cc:

#include <iostream> 
    #include "buttons.h" 

    Buttons::Buttons() 
    { 
    m_button.add_pixlabel("info.xpm", "click here"); 

    set_title("Pixmap'd buttons!"); 
    set_border_width(10); 

    m_button.signal_clicked().connect(sigc::mem_fun(*this, 
      &Buttons::on_button_clicked)); 

    add(buttonBox); 

    buttonBox.pack_start(m_button); 

    //m_button.show(); 
    show_all_children(); 
    } 

    Buttons::~Buttons() 
    { 

    } 

    void Buttons::on_button_clicked() 
    { 
    printLine(); 
    } 

私はプログラムをコンパイルする++グラムを使用していますが、それは私にこれを提供しますエラーメッセージ: g ++ main.cc -o button pkg-config gtkmm-3.0 --cflags --libs /tmp/c cKyphYe.o:機能でmain': main.cc:(.text+0x93): undefined reference toボタン::ボタン() ' main.cc:(.text+0xc5):Buttons::~Buttons()' main.cc:(.text+0x124): undefined reference toボタンへの未定義参照::〜ボタン()' collect2は:エラー:ldは

1つの終了ステータスを返しました
+0

すべてのソースファイルをコンパイル行に入れる必要があります。したがって、main.ccの直後にbuttons.ccを追加するだけでよいはずです。それを行うには他にも方法がありますが、あなたを動かすためにはうまくいくはずです。 – xaxxon

答えて

1

すべてのソースファイルをコンパイル行に入れなければならないので、main.ccの直後にbuttons.ccを追加するだけでよいはずです。それを行うには他にも方法がありますが、あなたを動かすためにはうまくいくはずです。

コンパイラがそれぞれのsrcファイル(あなたの例の.ccファイル)を別々にコンパイルし、オブジェクトファイル(.oまたは.obj)をビルドするということです。これを行うには、使用するものの宣言(ヘッダファイルに#includeされたもの)だけが必要です。見つからない場合は、「コンパイラエラー」が発生します。

しかし実際に実行する最終プログラムを実際に組み立てるときには、使用されるすべてのものの実際の定義(実際のコード)が必要であり、実際の定義が見つからない場合は、 "定義されていない参照"エラー。これは「リンカーエラー」と呼ばれます。これは、ライブラリ、アーカイブ、またはオブジェクト(.obj)ファイルがないことを意味します。

main()関数を含むすべてのC++ srcファイルと同じコンパイラ行にすべてを置くと、コンパイラによってオブジェクトファイルが自動的に生成され、リンクがすべて1ステップで実行されます。

関連する問題