Seite 1 von 1

QUdpSocket, Linker Problem, DevC++

Verfasst: 15. Januar 2007 15:56
von nyquist
Hallo,

ich muss heute mein erstes Programm mit C++ und QT schreiben. Nach dem Kompilieren meines Programms (eine main.cpp, und eine Klasse, aufgeteilt in eine .h und eine .cpp Datei) bekomme ich diese Fehler vom Linker:

Code: Alles auswählen

wndNetwork.cpp:22: undefined reference to `_imp___ZN12QHostAddressC1ENS_14SpecialAddressE'
wndNetwork.o(.text+0x19f):wndNetwork.cpp:22: undefined reference to `_imp___ZN10QUdpSocket4bindERK12QHostAddresst'
wndNetwork.o(.text+0x1c4):wndNetwork.cpp:22: undefined reference to `_imp___ZN12QHostAddressD1Ev'
wndNetwork.o(.text+0x1f0):wndNetwork.cpp:22: undefined reference to `_imp___ZN12QHostAddressD1Ev'
wndNetwork.o(.text+0x2b7): In function `ZN10wndNetworkC2Ev':
wndNetwork.cpp:43: undefined reference to `_imp___ZN10QUdpSocketC1EP7QObject'
wndNetwork.o(.text+0x2d6):wndNetwork.cpp:43: undefined reference to `_imp___ZN10QUdpSocketC1EP7QObject'
wndNetwork.o(.text+0xb1f):wndNetwork.cpp:65: undefined reference to `QUdpSocket::~QUdpSocket()'
wndNetwork.o(.text+0xb46):wndNetwork.cpp:65: undefined reference to `QUdpSocket::~QUdpSocket()'
wndNetwork.o(.text+0xc37): In function `ZN10wndNetworkC1Ev':
wndNetwork.cpp:43: undefined reference to `_imp___ZN10QUdpSocketC1EP7QObject'
collect2: ld returned 1 exit status
make.exe: *** [../bin/ExampleProject.exe] Error 1
Das ganze ist nicht vollständig kopiert und die Verzeichnisse habe ich im obigen Code entfernt, um ihn lesbarer zu machen. Die wesentlichen Link Fehler sollten aber erkennbar sein. Bei den anderen Link-Fehlern handelt es sich nämlich um die gleichen Fehler in anderen Funktionen.

CODE AUSZÜGE

wndNetwork.h:

Code: Alles auswählen

#ifndef wndNetwork_h
#define wndNetwork_h

#include <QtGui>
#include <QObject>
#include <QtNetwork>
#include <QUdpSocket>
#include <QHostAddress>

class QTimer;
class QUdpSocket;

class wndNetwork : public QDialog
{
    Q_OBJECT;
    public:
        wndNetwork(void);

    public slots:
        void request();
        // ...

    private:
        // ...

        QUdpSocket udpSocketRead;
        QUdpSocket udpSocketSend;
        QTimer *timer;

};
#endif
wndNetwork.cpp:

Code: Alles auswählen

#include "wndNetwork.h"
#include <QtNetwork>
#include <QUdpSocket>
#include <QHostAddress>

static const int TotalBytes = 50 * 1024 * 1024;
static const int PayloadSize = 65536;

void wndNetwork::request()
{
    milliseconds = 0;
    recived = false;
    
    long t = 0;
    udpSocketRead.bind(QHostAddress::LocalHost, 8100);

}

wndNetwork::wndNetwork(void)
{
    // ...
}
Alle Sourcen liegen in einem Verzeichnis. Wenn ich die Aufrufe von udpSocketRead etc. (damit meine ich nicht die Deklaration in der .h Datei) entferne, erhalte ich keinen Fehler.

Ich hatte auch schon versucht den Socket als Pointer zu deklarieren. Das funktioniert auch nicht. Übrigend verwende ich eigene SLOTs in der Klasse, die auch funktionieren (also Q_OBJECT sollte dann korrekt eingebunden sein). Allerdings ist das wie gesagt mein erstes Program und ich komme mit dem Linker nicht weiter.

Plattform: WinXP, QT4?, DevC++

Danke für die Hilfe!

Verfasst: 15. Januar 2007 16:33
von Christian81
Wenn mit qmake erzeugt -> QT += network fehlt
ansonsten: QtNetwork(d).lib beim Linker mit angeben

Verfasst: 15. Januar 2007 16:36
von nyquist
Das Problem ist, dass ich nicht mal weiß, wo ich das bei DevC++ angeben soll/kann/muss.

Verfasst: 15. Januar 2007 16:38
von Christian81
Wie hast du das Qt-Projekt denn dann erzeugt?

Verfasst: 15. Januar 2007 16:40
von nyquist
Naja, das war eine Vorlage vom Instiut. Hilft Dir das hier weiter?

ExampleProject.dev

Code: Alles auswählen

[Project]
FileName=ExampleProject.dev
Name=HelloWorld
UnitCount=4
Type=1
Ver=1
ObjFiles=
Includes=
Libs=V:\qt\current\lib
PrivateResource=
ResourceIncludes=
MakeIncludes=qt_moc.mak
Compiler=
CppCompiler=
Linker=-lqtcored4_@@_-lqtguid4_@@_
IsCpp=1
Icon=
ExeOutput=..\bin
ObjectOutput=..\obj
OverrideOutput=0
OverrideOutputName=HelloWorld.exe
HostApplication=
Folders=
CommandLine=
UseCustomMakefile=0
CustomMakefile=Makefile.Release
IncludeVersionInfo=0
SupportXPThemes=0
CompilerSet=0
CompilerSettings=0000000010000001000000

[Unit1]
FileName=main.cpp
CompileCpp=1
Folder=
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=$(CPP) -c main.cpp -o ../obj/main.o $(CXXFLAGS)

[VersionInfo]
Major=0
Minor=1
Release=1
Build=1
LanguageID=1033
CharsetID=1252
CompanyName=
FileVersion=
FileDescription=Developed using the Dev-C++ IDE
InternalName=
LegalCopyright=
LegalTrademarks=
OriginalFilename=
ProductName=
ProductVersion=
AutoIncBuildNr=0

[Unit2]
FileName=wndNetwork.h
CompileCpp=1
Folder=
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=

[Unit3]
FileName=wndNetwork.cpp
CompileCpp=1
Folder=
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=

[Unit4]
FileName=moc_wndNetwork.cpp
CompileCpp=1
Folder=HelloWorld
Compile=1
Link=1
Priority=1000
OverrideBuildCmd=0
BuildCmd=

Verfasst: 15. Januar 2007 16:43
von Christian81
Linker=-lqtcored4_@@_-lqtguid4_@@_
-->
Linker=-lqtcored4_@@_-lqtguid4_@@_-lqtnetworkd4_@@_

Allerdings ist das unvollständig - irgendwie nur für den Debug-Modus spezifiziert. Für Release müsste die Zeile dann
Linker=-lqtcore4_@@_-lqtgui4_@@_ -lqtnetwork4_@@_
heissen.

Verfasst: 15. Januar 2007 16:46
von nyquist
Ok danke! Ich glaube es funktioniert!