再次感谢yunfan兄,全靠他我才明白问题的解决之道。下面是他的回答:
出现这样字样的提示,
“undefined reference to ” ,
无论是c,gtk 还是 c++,qt,kde 程序, 都是链接程序 ld 没有找到链接库的原因。 链接库必须由开发者手工指定, 你用 QPushButton 没有问题, 是因为 qt 工程文件里默认已经含有了配置 qt 库的命令, qmake 生成 makefile 的时候,会自动加上对 qt 的链接命令。 而Qwt是第三方扩展库, qt 并不认识, 也不知道里面是什么东西。 所以, 你做如下操作:
1。 打开你的工程文件, 就是以 pro 为扩展名的文件
2。 找个地方加一行: LIBS += -lqwt
3。 保存 pro 文件退出
然后重新编译试试, good luck
我在尝试将QtDesigner编出带qwt控件的界面进行编译时老是出现undefined reference的报错。起初我以为是我自己编的代码的问题,后来发现如果我把我界面里的那个控件换成Qt标准控件QPushButton编译就不会出现问题。下面是编译出错的错误信息:
- main.o: In function `Ui_Form::setupUi(QWidget*)':
- /home/chwoozy/qt/widget/ui_untitled.h:20: undefined reference to `QwtKnob::QwtKnob(QWidget*)
- collect2: ld returned 1 exit status
- make: *** [widget] 错误 1
但是很奇怪的是在qwt的文档里所述的QwtKnob的构造函数里的参数就是和QPushButton一样的QWidget*,那怎么会还出错呢?下面是截取的文档的一段:
- Constructor & Destructor Documentation
- QwtKnob::QwtKnob ( QWidget * parent = NULL ) [explicit]
-
- Constructor.
- Parameters:
- parent Parent widget
我再把我的源文件帖出来吧
main.cpp
- #include "ui_untitled.h"
- #include <QApplication>
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- QWidget *widget = new QWidget;
- Ui::Form ui;
- ui.setupUi(widget);
- widget->show();
- return app.exec();
- }
导致编译不能通过的那个ui_untitled.h
- #ifndef UI_UNTITLED_H
- #define UI_UNTITLED_H
- #include <QtCore/QVariant>
- #include <QtGui/QAction>
- #include <QtGui/QApplication>
- #include <QtGui/QButtonGroup>
- #include <QtGui/QWidget>
- #include "qwt_knob.h"//Qwt提供的自定义部件QwtKnob的头文件
- class Ui_Form
- {
- public:
- QwtKnob *Knob;
- void setupUi(QWidget *Form)
- {
- Form->setObjectName(QString::fromUtf8("Form"));
- Form->resize(QSize(400, 300).expandedTo(Form->minimumSizeHint()));
- Knob = new QwtKnob(Form);
- Knob->setObjectName(QString::fromUtf8("Knob"));
- Knob->setGeometry(QRect(130, 100, 100, 100));
- Knob->setOrientation(Qt::Horizontal);
- retranslateUi(Form);
- QMetaObject::connectSlotsByName(Form);
- } // setupUi
- void retranslateUi(QWidget *Form)
- {
- Form->setWindowTitle(QApplication::translate("Form", "Form", 0, QApplication::UnicodeUTF8));
- Q_UNUSED(Form);
- } // retranslateUi
- };
- namespace Ui {
- class Form: public Ui_Form {};
- } // namespace Ui
- #endif // UI_UNTITLED_H
修改之后可以编译通过的ui_untitled.h(就是把界面中的QwtKnob部件替换成QPushButton部件后就没有问题了,怪事)
- #ifndef UI_UNTITLED_H
- #define UI_UNTITLED_H
- #include <QtCore/QVariant>
- #include <QtGui/QAction>
- #include <QtGui/QApplication>
- #include <QtGui/QButtonGroup>
- #include <QtGui/QPushButton>
- #include <QtGui/QWidget>
- class Ui_Form
- {
- public:
- QPushButton *pushButton;
- void setupUi(QWidget *Form)
- {
- Form->setObjectName(QString::fromUtf8("Form"));
- Form->resize(QSize(400, 300).expandedTo(Form->minimumSizeHint()));
- pushButton = new QPushButton(Form);
- pushButton->setObjectName(QString::fromUtf8("pushButton"));
- pushButton->setGeometry(QRect(160, 160, 87, 27));
- retranslateUi(Form);
- QMetaObject::connectSlotsByName(Form);
- } // setupUi
- void retranslateUi(QWidget *Form)
- {
- Form->setWindowTitle(QApplication::translate("Form", "Form", 0, QApplication::UnicodeUTF8));
- pushButton->setText(QApplication::translate("Form", "PushButton", 0, QApplication::UnicodeUTF8));
- Q_UNUSED(Form);
- } // retranslateUi
- };
- namespace Ui {
- class Form: public Ui_Form {};
- } // namespace Ui
- #endif // UI_UNTITLED_H
我在想,会不会是因为没有把QwtKnob的实现即qwt_knob.cpp给包括进来
请各位高手多多指教了
[ 此贴被chwoozy在2006-05-10 11:40重新编辑 ]