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

Diskutiere mit über: Mac und QT prebinding disabled (...) undefined symbols im Mac OS X Entwickler, Programmierer Forum

  1. Gammon

    Gammon Thread Starter MacUser Mitglied

    Beiträge:
    7
    Zustimmungen:
    0
    Registriert seit:
    11.09.2004
    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...
     
  2. Gammon

    Gammon Thread Starter MacUser Mitglied

    Beiträge:
    7
    Zustimmungen:
    0
    Registriert seit:
    11.09.2004
    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???
     
  3. 69felix

    69felix MacUser Mitglied

    Beiträge:
    1
    Zustimmungen:
    0
    Registriert seit:
    28.04.2005
    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 von einem Moderator bearbeitet: 25.10.2015
  4. solesides

    solesides MacUser Mitglied

    Beiträge:
    1
    Zustimmungen:
    0
    Registriert seit:
    28.07.2005
    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
     
Die Seite wird geladen...
Ähnliche Themen - Mac prebinding disabled Forum Datum
.html - Datei auf Mac erstellt und in Windows öffnen ? Mac OS X Entwickler, Programmierer 07.11.2016
IntelliJ mit deutscher Mac Tastatur Mac OS X Entwickler, Programmierer 27.07.2016
C++ Programm von Windows zu Mac? Mac OS X Entwickler, Programmierer 05.05.2016
Mac Programmierung aufwendiger als iOS? Mac OS X Entwickler, Programmierer 30.12.2015
mac betriebssysteme > anfrag an apple wird natürlich nicht beantwortet ! Mac OS X Entwickler, Programmierer 21.08.2014

Diese Seite empfehlen

Benutzerdefinierte Suche