Seite 1 von 1

Static Lib mit QT

Verfasst: 27. November 2007 07:59
von cool.runnings
Hallo,

nachdem die Hilfe gestern mit dem Makefile so super funktioniert hat steh ich nun vor dem nächsten Problem.

Ich hab das Programm hier:

networkLib.h

Code: Alles auswählen

#ifndef NETWORKLIB_H_
#define NETWORKLIB_H_

// --------------------------------------------------------
// Includes -
// --------------------------------------------------------
//#include "_tycs.h"
#include "inifile.h"
#include </usr/include/qt4/QtNetwork/QTcpSocket>
#include </usr/include/qt4/QtNetwork/QtNetwork>

// --------------------------------------------------------
// Class -
// --------------------------------------------------------
class MyNetwork : public QTcpSocket
{
	Q_OBJECT
	
public:
	QTcpSocket tcpSocket;
	int nextBlockSize;
	
public:
	MyNetwork();
	
public slots:
	void tcpConnected();
	void tcpDisconnected();
	void tcpRead();
	void tcpError();
	
};

#endif /*NETWORKLIB_H_*/
networkLib.cpp

Code: Alles auswählen

// --------------------------------------------------------
// Includes -
// --------------------------------------------------------
#include "networkLib.h"
#include "inifile.h"
#include "typeDefs.h"
#include <iostream>

MyNetwork::MyNetwork() 
{
	connect ( &tcpSocket, 
			  SIGNAL(connected()), 
			  this, 
			  SLOT(tcpConnected()));
	        
	connect ( &tcpSocket,
			  SIGNAL(disconnected()),
			  this, 
			  SLOT(tcpDisconnected()));
	
	connect ( &tcpSocket, 
			  SIGNAL(readyRead()),
	          this, 
	          SLOT(tcpRead()));
	
	connect ( &tcpSocket, 
			 SIGNAL(error(QAbstractSocket::SocketError)),
	         this, 
	         SLOT(tcpError()));
	
	tcpSocket.connectToHost("xxx", 21);
}

void MyNetwork::tcpConnected()
{
    std::cout << "Connected successfully";
    std::cout.flush();
}

void MyNetwork::tcpDisconnected()
{
    std::cout << "Disconnected successfully";
    std::cout.flush();
}

void MyNetwork::tcpRead()
{
    std::cout << "Read\n";
    std::cout.flush();
    
    char    buf[512];
    int     read_ret    = 0;
   
    
    if (tcpSocket.bytesAvailable() != 0)
    {
    	read_ret =  tcpSocket.read(buf, 512);
        printf("received[%i] '%s'\n", read_ret, buf);
    }  
}

void MyNetwork::tcpError()
{
    std::cout << "Error";
    std::cout.flush();
}
als static library erstellt:

networkLib.pro

Code: Alles auswählen

CONFIG += staticlib
TEMPLATE = lib
TARGET = networkLib
QT += core \
    network
HEADERS += typeDefs.h \
    networkLib.h \
    inifile.h
SOURCES += networkLib.cpp \
    inifile.cpp
FORMS += 
RESOURCES += 
Diese erstellt er mir auch ohne Fehlermeldung.

Wenn ich diese staticlib nun in ein anderes Programm einbinde, macht er an der stelle

Code: Alles auswählen

MyNetwork *nw = new MyNetwork();
einfach nichts. Er geht über den Code drüber und erzeugt keine Ausgaben.

Lasse ich mein networkLib aber als app erstellen und rufe da o.g. Konstruktor in der main auf geht alles ohne Probleme.

Headerdatei und staticlib haben den selben Namen, müsste also eigentlich alles klappen.

Kann es sein, dass irgendetwas nicht mit in die lib eingebunden wird und dann fehlt?

Gruß
Michael

Verfasst: 27. November 2007 11:17
von cool.runnings
Also ich bin schon ein Stückchen weiter.
Ich habe in der Klasse MyNetwork mal eine eine einfache Funktion erstellt die nur Text ausgibt.
Diese kann ich einfach ausführen und der Text wird ausgegeben.
Also scheint das erstellen des *nw Objekts ja richtig zu funktionieren.
Nur, dass das "ConnectToHost" nicht richtig klappt.
Beim debuggen erhalte ich auch die Meldung

Code: Alles auswählen

No symbol "QTcpSocket" in current context.

Verfasst: 27. November 2007 11:47
von solarix
Kann es sein, dass irgendetwas nicht mit in die lib eingebunden wird und dann fehlt?
nein.. der Linker waere da gar nicht gluecklich und wuerde das Programm entweder nicht starten oder spaetestens beim Zugriff auf das Symbol beenden...
Er geht über den Code drüber und erzeugt keine Ausgaben.
naja.. ich waage mal zu behaubten, dass du gar keine funktionierende Fehlerbehandlung hast:

Signal:
void QTcpSocket::error( QAbstractSocket::SocketError socketError )

hier wird ein parameter des Typs "SocketError" gefordert...

Code: Alles auswählen

void MyNetwork::tcpError()
hat aber keine Parameter...
Beim debuggen erhalte ich auch die Meldung
Diese Meldung kommt nur vom Debugger.. bin mir nicht 100% sicher, aber
in der Profile:

Code: Alles auswählen

 CONFIG += debug
sollte helfen.. (bei allen beteiligten Qt-Projekten)

Noch ein paar andere "Kleinigkeiten"

Code: Alles auswählen

#include </usr/include/qt4/QtNetwork/QtNetwork>
haesslich.. warum hoert eigentlich niemand auf Christian81 (siehe dein letzter Thread)? Schmeiss diese absoluten Pfade raus!!

Code: Alles auswählen

#include <QTcpSocket> 
nimm ausserdem nur includes in die Header, welche auch wirklich von der Header benoetigt werden.. ich sehe da keinen Grund fuer:

Code: Alles auswählen

#include "inifile.h" 
Also raus damit!

was war da noch... ach ja:

Code: Alles auswählen

public:
   QTcpSocket tcpSocket;
   int nextBlockSize; ]
Mach das Zeugs private und biete dem Anwender der Klasse eine sauberes Interface (Notfalls reichen hier ja "get"-Methoden)..

Verfasst: 27. November 2007 13:43
von cool.runnings
Also das mit QTcpSocket::error( QAbstractSocket::SocketError socketError ) habe ich inzwischen korrigiert.
Hat aber auch keinen Erfolg gebracht.

Was mich halt wundert ist, das es als app funktioniert nur wenn ich es als lib kompiliere und dann den Konstruktor aufrufe eben nicht.

Verfasst: 27. November 2007 17:03
von cool.runnings
Also so langsam verzweifle ich hier.

Kann es irgendwie an Eclipse liegen, dass es nicht funktioniert?

Verfasst: 27. November 2007 18:25
von Christian81
Einfach mal debuggen würde ich sagen.

Verfasst: 27. November 2007 18:52
von cool.runnings
Hab ich ja auch schon gemacht, der geht einfach über die connect Funktion drüber ohne irgendeine Fehlermeldung.
Aber in einen von den Slots geht er dann auch nicht.

Verfasst: 27. November 2007 19:15
von Christian81
Dann die Lib eben mal mit Debug-infos erstellen.

Verfasst: 28. April 2009 13:42
von Pebcak
Hallo,

gleiches Problem habe ich auch (aktuelle Version 4.5.1).

Bei meiner statisch gebildeten QT Version werden manche Slots nicht richtig miteinander verbunden. Die Funktion QObject::connect liefert ein "true" zurück, also alles OK.

Aber anscheinend wird das signal niemals geworfen / ausgeführt.

Bei mir habe ich verschiedene Signals verwendet, z.B. readyRead vom QTcpSocket oder auch eigene Signale, die per emit manuell ausgelöst werden. Bei allen wird meine slot-funktion aber nicht angesprungen.

Wenn ich alles mit dynamischen QT verwende funktioniert alles wie es sein soll. Also warum nicht beim statischen QT?

Gruß
Pebcak

Zur Info

Verfasst: 27. Mai 2009 15:52
von Pebcak
Des Rätsels Lösung ...

What happened here is that your application basically has two disjoint
eventloops, where only one is running, the application one. The
signals and other events in the library will be queued in the libraries
event queue, and never delivered to their destination.

You'll need to use a shared Qt to ensure that they share an event loop.