我正在写一个GTKmm窗口程序;主窗口创建两个按钮,一个用于英语,一个用于中文。用户可以单击按钮以适当的语言显示不同的窗口。目前我在主窗口内初始化多项容器时遇到问题。它是MainWindowPane类型的对象,它继承了Gtk :: HBox。
当我尝试制作时,编译器会发出以下错误:
$ make
g++ -g `pkg-config gtkmm-2.4 --cflags` -c MainWindow.cpp
g++ -g -o QPI_frontend main.o MainWindow.o StartButton.o `pkg-config gtkmm-2.4 --libs`
MainWindow.o: In function `MainWindow':
/home/dmurvihill/Documents/QPI_frontend/MainWindow.cpp:9: undefined reference to `MainWindowPane::MainWindowPane()'
/home/dmurvihill/Documents/QPI_frontend/MainWindow.cpp:9: undefined reference to `MainWindowPane::MainWindowPane()'
collect2: ld returned 1 exit status
make: *** [QPI_frontend] Error 1
我正在使用最新版本的gcc和pkg-config来包含正确的库。我也是一个java人。
/*
* MAIN_WINDOW.H
* Responsible for creating "slave" RSED windows. Can create English or Chinese
* versions of the demo, and can destroy them all with one click.
*/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <gtkmm/window.h>
//#include "SlaveWindow.h"
#include "StartButton.h"
#include "MainWindowPane.h"
class MainWindow : public Gtk::Window
{
public:
MainWindow();
private:
MainWindowPane pane;
// std::list<SlaveWindowThread> windows; // Keeps track of all windows that have been created thus far.
void destroyAllWindows(); // Iterates through the linked list and destroys each window.
};
#endif //ifndef MAINWINDOW_H
/*
* MAIN_WINDOW.CPP
*
*/
#include "MainWindow.h"
#include "MainWindowPane.h"
#include "StartButton.h"
MainWindow::MainWindow()// : /*list,*/ pane(/*list*/)
{
pane;
}
void MainWindow::destroyAllWindows()
{
//gtk_widget_destroy(*this);
// TODO: Destroy all the other windows too.
}
/*
* MAIN_WINDOW_PANE.H
*/
#ifndef MAINWINDOWPANE_H
#define MAINWINDOWPANE_H
#include <gtkmm/box.h>
#include <gtkmm/button.h>
//#include "SlaveWindow.h"
#include "StartButton.h"
class MainWindowPane : public Gtk::HBox
{
public:
MainWindowPane(/*&(std::list)*/);
private:
StartButton englishButton; // Used to create a new RSED demo screen.
StartButton chineseButton; // Used to create a new RSED demo in chinese.
// std::list<SlaveWindow> windows; // Keeps track of all windows that have been created thus far.
void destroyAllWindows(); // Iterates through the linked list and destroys each window.
};
#endif //ifndef MAINWINDOWPANE_H
/*
* MAIN_WINDOW.CPP
*
*/
#include "MainWindowPane.h"
#include "StartButton.h"
MainWindowPane::MainWindowPane(/*&(std::list)*/) :
englishButton(StartButton::ENGLISH/*,&(std::list)*/),
chineseButton(StartButton::CHINESE/*,&(std::list)*/)
{
pack_start(englishButton);
englishButton.show();
pack_start(chineseButton);
chineseButton.show();
}
void MainWindow::destroyAllWindows()
{
//gtk_widget_destroy(*this);
// TODO: Destroy all the other windows too.
}
答案 0 :(得分:8)
未定义的引用错误意味着你
忘了写定义缺失的功能
(通过在.cpp
文件中编写实现),
或者您忘记将相应的目标文件或库链接到最终的二进制文件中。
在这种情况下,这是后来的原因。
您需要在makefile中的linker命令中包含MainWindowPane.o
:
g++ -g -o QPI_frontend main.o MainWindow.o StartButton.o `pkg-config gtkmm-2.4 --libs`
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
you need MainWindowPane.o in here
答案 1 :(得分:0)
抱怨您正在尝试为不存在的MainWindowPane调用默认构造函数。
我的猜测是,MainWindowPane只定义带有参数的ctors,并且你将它用作基类,和你要么没有为派生类定义ctor,要么你做了ctor define没有用参数调用base。
class MyDerived : public MainWindowPane
{
public:
MyDerived() {....} // bad
MyDerived(int x) : MainWindowPane(x) // good
{....}
更新:
好的,忽略上面的内容(在你发布代码之前写的)。它似乎在抱怨这条线“
MainWindow::MainWindow()// : /*list,*/ pane(/*list*/)
{
pane; // Error HERE.
}
我真的不知道这条线的目的是什么。您只是引用数据成员,而不对其执行任何操作。它可能会被删除。
UPDATE2:
如果您不采取任何措施,pane
将默认构建:
MainWindow::MainWindow()
{
}