0 Daumen
1,8k Aufrufe

Eine Klasse "test" erstellen und in Klasse "mainwindow" nutzen.

Keine Fehlermeldungen aber ich kann keine Variable vom typ test erstellen ohne einen

Linker error : LNK2019 Verwei auf nicht aufgelöstes externes Symbol

( bzw. LNK1120 nicht aufgelöste externe)  zu bekommen.


TEST_H

class test : public QWidget
{
    Q_OBJECT

    QLabel * lab = nullptr ; 
public:

    explicit test(QWidget *parent = nullptr);
};

TEST CPP

test::test(QWidget *parent) : QWidget(parent)
{
  lab = new QLabel("bbb");





MAINWINDOW_H

#include"test.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    virtual ~MainWindow() {}

private:
    test * lab = nullptr;
    void createDockWindows();
};


MAINWINDOWCPP

#include "mainwindow.h"
#include"test.h"

MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent)
{...}

void MainWindow::createDockWindows()
{
    QDockWidget *dock = new QDockWidget(tr("label"), this);
    dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

    lab = new test;
dock->setWidget(lab); 
addDockWidget(Qt::LeftDockWidgetArea, dock);
}

    // hier benutzen wir einen Zeiger auf eine "test" variable

  


Avatar von

1 Antwort

+1 Daumen
 
Beste Antwort
Keine Fehlermeldungen aber ich kann keine Variable vom typ test erstellen

Natürlich kannst du das. Wenn du es nicht könntest, dann wäre schon viel früher ein Fehler aufgetaucht als beim Linken. Das Problem ist, dass du dem Linker nicht mitteilst, in welcher Objektdatei dieser Typ implementiert ist.

Wie du dem Linker mitteilst, in welcher Objektdatei der Typ implementiert ist, hängt vom Linker ab.

Avatar von 5,7 k

Danke für deine Antwort. Du hast natürlich Recht, ich dachte eigentlich es müsste dem Linker reichen in der test.cpp die Definition zu schreiben, aber  in Qt gibt  es anscheinend eine Sonderdatei um das dem Linker explizit  mitzuteilen. Und das muss ich mal ausprobieren danke.

ich dachte eigentlich es müsste dem Linker reichen in der test.cpp die Definition zu schreiben

Dem Compiler reicht das, also dem Teil, der aus den Quelltextdateien Objektdateien erzeugt.

Der Linker ist dafür verantwortlich, aus mehreren Objektdateien eine ausführbare Datei zu erzeugen. Wenn in diesem Stadium nicht alle notwendigen Objektdateien angegeben werden, dann scheitert dieser Schritt.

aber  in Qt gibt  es anscheinend eine Sonderdatei um das dem Linker explizit  mitzuteilen.

Nun ja, es gibt in Qt den Meta-Object Compiler. Du solltest sicher stellen, das dieser auch ausgeführt wird in die davon erzeugten Quelltextdateien übersetzt werden. Ansonsten gibt es aber keine Besonderheiten bei der Übersetzung von Programmen, die Qt verwenden.

Zusammengefasst: Das Projekt funktioniert tatsächlich. Der Fehler liegt hier an den   .PRO Dateien,  in welchen alle Dateien die Verlinkt werden sollen aufgelistet sein müssen (Qt) und sollte ungefähr so aussehen.

#-------------------------------------------------
#
# Project created by QtCreator 2018-12-06T11:09:52
#
#-------------------------------------------------

QT      += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Awo_Projekt_version1
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11

SOURCES += \
        main.cpp \
        mainwindow.cpp \
    test.cpp

HEADERS += \
        mainwindow.h \
    test.h \

FORMS += \
        mainwindow.ui \
        test.ui



# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target


Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community