簡體   English   中英

如何從c ++中的其他文件調用main函數?

[英]How to call function in main from other file in c++?

我正在使用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);

    }

button.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 

button.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按鈕pkg-config gtkmm-3.0 --cflags --libs /tmp/ccKyphYe.o:在函數main': main.cc:(.text+0x93): undefined reference to Buttons :: Buttons()的main.cc:(.text+0xc5):未定義對Buttons::~Buttons()' main.cc:(.text+0x124): undefined reference to Buttons ::〜Buttons()'的引用collect2:錯誤:ld返回1退出狀態

您必須將所有源文件放在編譯行中,因此只需在main.cc之后添加buttons.cc,就可以了。 還有其他方法可以做到,但只是為了讓您前進,這應該行得通。

更長的答案是編譯器分別編譯每個src文件(在您的示例中為.cc文件)並構建目標文件(.o或.obj)。 為此,它所需要的只是它使用的東西的聲明(在頭文件中包含#include)。 如果缺少它們,則會出現“編譯器錯誤”。

但是稍后,當它實際上將要運行的最終程序放到一起時,它需要使用的所有內容的實際定義(實際代碼),並且如果找不到實際定義,則會得到“未定義引用”錯誤。 這稱為“鏈接器錯誤”。 這意味着您缺少庫,檔案或對象(.obj)文件。

但是,當您將所有內容放在同一編譯器行上時—所有c ++ src文件(包括一個帶有main()函數的文件),編譯器都會自動生成目標文件,並一步一步完成所有鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM