如何用c ++中的其他文件调用main中的函数?

时间:2016-05-20 23:22:12

标签: c++ gtk gtkmm

我用gtk(或者在这种情况下是gtkmm)练习,我是全新的,而且我对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 ++编译程序,它给了我这个错误信息: g ++ main.cc -o button pkg-config gtkmm-3.0 --cflags --libs /tmp/ccKyphYe.o:在函数main': main.cc:(.text+0x93): undefined reference to按钮::按钮()&#39; main.cc:(.text+0xc5):未定义引用Buttons::~Buttons()' main.cc:(.text+0x124): undefined reference to按钮::〜按钮()&#39; collect2:错误:ld返回1退出状态

1 个答案:

答案 0 :(得分:1)

你必须将所有源文件放在编译行中,所以只需在main.cc之后添加buttons.cc就可以了。还有其他方法可以做到,但只是为了让你前进,这应该有用。

更长的答案是编译器分别编译每个src文件(示例中的.cc文件)并构建目标文件(.o或.obj)。要做到这一点,它所需要的只是它使用的东西的声明(#include&#39; d在头文件中)。如果它们丢失,则会出现#34;编译错误&#34;。

但是后来当它实际组合你将要运行的最终程序时,它需要所有使用的实际定义(实际代码),如果它找不到实际的定义,那么你得到&#34;未定义的引用&#34;错误。这被称为&#34;链接器错误&#34;。这意味着您缺少库,档案或对象(.obj)文件。

然而,当你把所有的东西都放在同一个编译器行上时 - 你所有的c ++ src文件,包括一个带有main()函数的文件,编译器会自动生成目标文件并一步完成链接。