Mac und QT prebinding disabled (...) undefined symbols

G

Gammon

Neues Mitglied
Thread Starter
Dabei seit
11.09.2004
Beiträge
7
Reaktionspunkte
0
Hi,ich wollte ein Programm übersetzen, das einen kleinen "Find" Dialog darstellt.

Wenn ichs aber mit qmake -project && qmake && make
übersetzen will, kommt die Meldung:
/usr/bin/ld: warning prebinding disabled because of undefined symbols
/usr/bin/ld: Undefined symbols:
___vt_10FindDialog
___vt_10FindDialog.12QPaintDevice
_findNext__10FindDialogRC7QStringb
_findPrev__10FindDialogRC7QStringb
_tr__10FindDialogPCcn1
make: *** [prog.app/Contents/MacOS/noch] Error 1

Hier der Quellcode (Habs aus nem Buch abgeschrieben):

//finddialog.cpp

#include <qcheckbox.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include"finddialog.h"


FindDialog::FindDialog(QWidget *parent, const char *name) :QDialog(parent, name)
{
setCaption(tr("Find"));
label = new QLabel(tr("Find&what:"), this);
lineEdit = new QLineEdit(this);
label->setBuddy(lineEdit);
caseCheckBox = new QCheckBox(tr("Match&case"), this);
backwardCheckBox = new QCheckBox(tr("Search&backward"), this);
findButton = new QPushButton(tr("&Find"), this);
findButton->setDefault(true);
findButton->setEnabled(false);
closeButton = new QPushButton(tr("Close"), this);

connect(lineEdit, SIGNAL(textChanged(const QString &)),this, SLOT(enableFindButton(const QString &)));
connect(findButton, SIGNAL(clicked()),this, SLOT(findClicked()));
connect(closeButton, SIGNAL(clicked()),this, SLOT(close()));

QHBoxLayout *topLeftLayout = new QHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);
QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(backwardCheckBox);
QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(findButton);
rightLayout->addWidget(closeButton);
rightLayout->addStretch(1);
QHBoxLayout *mainLayout = new QHBoxLayout(this);

mainLayout->setMargin(11);
mainLayout->setSpacing(6);
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);
}


void FindDialog::findClicked()
{
QString text = lineEdit->text();
bool caseSensitive = caseCheckBox->isOn();
if (backwardCheckBox->isOn())
emit findPrev(text, caseSensitive);
else
emit findNext(text, caseSensitive);
}

void FindDialog::enableFindButton(const QString&text)
{
findButton->setEnabled(!text.isEmpty());
}


// Finddialog.h
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <qdialog.h>
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog :public QDialog
{
Q_OBJECT
public:
FindDialog(QWidget *parent = 0, const char *name = 0);
signals:
void findNext(const QString&str, bool caseSensitive);
void findPrev(const QString&str, bool caseSensitive);

private slots:
void findClicked();
void enableFindButton(const QString&text);

private:
QLabel *label;
QLineEdit *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *backwardCheckBox;
QPushButton *findButton;
QPushButton *closeButton;

};
#endif


//main.cpp
#include <qapplication.h>
#include"finddialog.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
FindDialog *dialog = new FindDialog;
app.setMainWidget(dialog);
dialog->show();
return app.exec();
}

schon mal danke im Vorraus...
 
Also ich konnte das Problem jetzt mal auf das Wesentliche reduzieren... (glaub ich):

Hier der Quellcode:

// prog.h:
#ifndef _diag_
#define _diag_

#include <qdialog.h>

class meins : public QDialog
{
//Q_OBJECT
public:
meins(QWidget *parten = 0, const char* name= 0);

};

#endif

//prog.cpp:
#include "prog.h"

meins::meins(QWidget *parent, const char* name) : QDialog(parent,name)
{

}

//main.cpp
#include <qapplication.h>
#include "prog.h"

int main(int argc,char** argv)
{
QApplication obj(argc,argv);
meins *ding = new meins;
obj.setMainWidget(ding);
ding->show();
return obj.exec();
}

Dieses Programm zeigt jetzt ein einfaches Dialog Fenster an.
Wenn ich das in prog.h auskommentierte Macro Q_OBJECT
wieder einfüge, gibts die Fehlermeldung:


/usr/bin/ld: warning prebinding disabled because of undefined symbols
/usr/bin/ld: Undefined symbols:
___vt_5prog
___vt_5prog.12QPaintDevice
make: *** [prog.app/Contents/MacOS/prog] Error 1

Hat jemand ne Idee???
 
Hi Gammon,
ich hatte das gleiche Problem und habe mit den Beispielen experimentiert: wenn die Klassendefinition mit dem "bösen" Q_Object Makro in einer Header-Datei liegt, kann man compilieren.

Da es offensichtlich QT/Mac betrifft, könnte das Problem am Mac Zeilenumbruch liegen -> http://lists.trolltech.com/qt-interest/2002-12/msg00471.html

Habe ich allerdings noch nicht weiter getestet.

Gruß Urban
 
Zuletzt bearbeitet von einem Moderator:
Hi,

ich gehe davon aus das du zur Erstellung deines Makefiles qmake benutzt.
Das Problem liegt wahrscheinlich darin, dass dein Makefile nicht aktuell ist.
Es macht für qmake einen Unterschied, ob das Q_OBJECT Macro in einer Klasse enthalten ist oder nicht. Steht das Macro in der Klasse wird bei einem make auch ein moc davon erstellt. Da dieser Vorgang bei dir fehlt erhälst du undefined symbols beim Linken. Nimmst du das Macro raus, läuft es naturlich durch.

Führe einfach erneut qmake aus und es sollte funktionieren.

Ich weiss die Antwort kommt recht spät :) , aber vielleicht hat es ja für irgendjemand anderen einen Nutzen.

Viele Grüsse
solesides
 
Zurück
Oben Unten