"undefined reference to" Destruktor

Ich steh erade vor einem kleinen Problem. Ich hab 2 Projekte/Libs greife ich von dem einen Projekt auf das andere zu bekomme ich bei einer Klasse immer diese Meldung

debug/HardwareController.o: In function `ZN18HardwareControllerD2Ev':
D:/C++/Workspace/TimeMeasure/Controller/HardwareController.cpp:18: undefined reference to `SerialPortThread::~SerialPortThread()'
debug/HardwareController.o: In function `ZN18HardwareControllerD1Ev':
D:/C++/Workspace/TimeMeasure/Controller/HardwareController.cpp:18: undefined reference to `SerialPortThread::~SerialPortThread()'
debug/HardwareController.o: In function `ZN18HardwareControllerD0Ev':
D:/C++/Workspace/TimeMeasure/Controller/HardwareController.cpp:18: undefined reference to `SerialPortThread::~SerialPortThread()'
debug/HardwareController.o: In function `ZSt17__verify_groupingPKcjRKSs':

Verwende ich die Klasse in dem eigentlich Projekt gibt es keine Probleme, nur wenn sie im anderen Projekt benutzt wird.

Datei aus Projekt A

 * Created on 23.10.2009
 *
 * Copyright (c) 2009, Kay Czarnotta
 *
 * All rights reserved.
 */
#include "HardwareController.h"
#include "serialportthread.h"

HardwareController::HardwareController() : QObject(this)
{
    //portThread = SerialPortThread(1);
    //connect(&portThread, SIGNAL(connectionStatusChanged(int)), this, SLOT(connectionStateChanged(int)));
}

HardwareController::~HardwareController()
{//<---Angeblich der Fehler
}

void HardwareController::startRace()
{
    portThread.start(QThread::HighPriority);
}

void HardwareController::connectionStateChanged(int state)
{

}

Datei aus Projekt B

 * Created on 19.10.2009
 *
 * Copyright (c) 2009, Kay Czarnotta
 *
 * All rights reserved.
 */
#ifndef SERIALPORTTHREAD_H
#define SERIALPORTTHREAD_H

#include <QThread>

class SerialPortThread: public QThread
{
    Q_OBJECT
public:
    SerialPortThread():QThread(this){}
    SerialPortThread(int portNumber);
    SerialPortThread(const SerialPortThread& port);
    virtual ~SerialPortThread();

    void run();
    void setTimeout(unsigned int timeout);
    unsigned int getTimeout();
    void interrupt();

    SerialPortThread& operator =(const SerialPortThread&);

private:
    //bool getSignalState(int signal);

signals:
        void signalReceived(int port);
        void connectionStateChanged(int type);

protected:
        bool isToSend(int port, bool signal);
        void copy(const SerialPortThread& port);

private:
        unsigned char portNumber;
        unsigned int timeout;
        bool interrupted;

public:
        static const int CONNECTION_FAILD = 1;
        static const int CONNECTION_ESTABLISHED = 2;
        static const int CONNECTION_READ_FAILD = 3;
        static const int CONNECTION_CLOSED = 4;

};


#endif // SERIALPORTTHREAD_H

Du musst gegen die lib linken die Du verwenden willst:
In der qmake:

unix:LIBS += -L/path/to/your/libs -lnameOfLib
win32:LIBS += c:/path/to/your/libs/nameOfLib.lib

Es gehen auch relative Pfade.

Es spielt dabei erstmal keine Rolle ob Du diese statisch oder dynamisch linkst. Bei dynamischer Linkung musst Du dann nur darauf achten das Du die .dll/.so immer mitlieferst.

Wichtig dann auch: Wenn Du eine dll erstellst die Export/Import declaration setzen.

#ifndef __MYLIB_GLOBAL_H__
#define __MYLIB_GLOBAL_H__

#include <QtCore/qglobal.h>

#if defined(MYLIB_LIBRARY)
#  define MYLIB_EXPORT Q_DECL_EXPORT
#else
#  define MYLIB_EXPORT Q_DECL_IMPORT
#endif

#endif // __MYLIB_GLOBAL_H::

Verwendung bei Klassen

class MYLIB_EXPORT SerialPortThread: public QThread { /*...*/ };

Gut Schuß
VuuRWerK :wink:

P.S.: Vorsicht bei der Verwendung von Schlüsselwörtern die von Qt belegt sind:

bool isToSend(int port, bool signal);  // signal is a keyword!

ahhh danke, das MYLIB_EXPORT das war der Punkt der gefehlt hat, ich versteh dann zwar nicht warum er sone komische Meldung rausgibt aber das scheint jetzt zu klappen :slight_smile:
Danke.

Naja, der Fehler bedeutet das der Linker kein Symbol findet was zu dem passt welches Du angibst, deswegen „undefined reference“. Der kann ja nicht ahnen das nur vergessen wurde das Symbol, was gebraucht wird, zu exportieren :wink:

Gut Schuß
VuuRWerK :wink:

ach der soll sich nicht so haben :wink: