Хобрук: Ваш путь к мастерству в программировании

Как вызвать функцию в main из другого файла в С++?

Я практикуюсь с gtk (или gtkmm в данном случае), в котором я совершенно новичок, и я относительно новичок в c++. У меня есть рабочая программа, которая может открыть окно и поместить в него несколько виджетов, но сейчас я пытаюсь добавить действие к кнопке, и это просто не работает.

основной.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);

    }

кнопки.ч:

    #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 

кнопки.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: In function main': main.cc:(.text+0x93): undefined reference toButtons::Buttons()' main.cc:(.text+0xc5) : неопределенная ссылка на Buttons::~Buttons()' main.cc:(.text+0x124): undefined reference toButtons::~Buttons()' collect2: ошибка: ld вернул 1 статус выхода

20.05.2016

  • вы должны поместить все свои исходные файлы в строку компиляции, поэтому просто добавьте buttons.cc сразу после main.cc, и все будет хорошо. Есть и другие способы сделать это, но просто для начала это должно сработать. 21.05.2016

Ответы:


1

Вы должны поместить все свои исходные файлы в строку компиляции, поэтому просто добавьте buttons.cc сразу после main.cc, и все будет хорошо. Есть и другие способы сделать это, но просто для начала это должно сработать.

Более длинный ответ заключается в том, что компилятор компилирует каждый файл src (файлы .cc в вашем примере) отдельно и создает объектные файлы (.o или .obj). Для этого все, что ему нужно, это объявления вещей, которые он использует (#include в заголовочных файлах). Если они отсутствуют, вы получите «ошибку компилятора».

Но позже, когда он на самом деле собирает окончательную программу, которую вы собираетесь запустить, ему нужны фактические определения (фактический код) для всего, что используется, и если он не может найти фактическое определение, вы получаете «неопределенная ссылка» ошибки. Это называется "ошибка компоновщика". Это означает, что вам не хватает библиотек, архивов или файлов объектов (.obj).

ОДНАКО, когда вы помещаете все в одну строку компилятора - все ваши файлы src С++, включая один с функцией main(), компилятор автоматически генерирует объектные файлы и выполняет связывание всех за один шаг.

20.05.2016
Новые материалы

Еженедельный выпуск React 75
Добро пожаловать в 75-й выпуск React Weekly, еженедельный обзор последних ссылок и руководств по React и React Native. Посетите Купить кофе , чтобы найти способы поддержать React Weekly, или..

(Почти) полнофункциональная реализация Gumbel MuZero в Джулии.
TLDR; Gumbel Muzero — это современный алгоритм обучения с подкреплением. Он достиг сверхчеловеческой производительности во многих настольных играх и даже, что более впечатляюще, в Atari..

Передача нейронного стиля в браузерах с использованием Angular и WebDNN
В последние годы глубокое обучение привлекло большое внимание из-за его безупречной производительности при обучении на обширных данных и высокой точности при выводе. Развертывание этих алгоритмов..

Шифр Цезаря в C
Шифр Цезаря  — один из самых простых и широко известных методов шифрования. Он включает в себя сдвиг каждой буквы в сообщении на определенное количество позиций в алфавите. В этой статье мы..

Исследовательский анализ данных (EDA)
Что такое ЭДА? Анализ данных, который ищет закономерности в данных, известен как исследовательский анализ данных. Это похоже на беглый просмотр данных, чтобы найти наиболее важные..

1x1 Convolution: демистификация
Чтобы пролить свет на концепцию операции свертки 1x1, которая представлена ​​в статье «Сеть в сети» Лин и др. и Google Inception Некоторое время назад я прочитал статью «Сеть в сети» (NiN),..

Лучшие расширения VS Code в 2022 году
Код ВС Лучшие расширения VS Code в 2022 году Список самых полезных расширений VS Code, которые вы можете использовать как разработчик в 2022 году Расширения находятся на рынке VS Code,..