Seite 1 von 1

Umzug von Eclipse nach VC++ Express -> Linker Fehler

Verfasst: 23. März 2007 13:57
von bill
Hallo an alle!

Bin neu hier und habe auch schon ein Problem, bei dem ich eure Hilfe benötige! Die Suchfunktion habe ich schon bemüht, leider aber nichts passendes gefunden.

Ich arbeite seit einiger Zeit an einem (vorhandene) Qt Projekt unter Eclipse + CDT + MinGW. Da diese Kombination leider nicht sehr zufriedenstellend läuft (seitens IDE), versuche ich gerade das ganze mit VC++ umzuziehen, um z.B. den Debugger davon zu verwenden.

Qt 4.2.3 habe ich schon für msvc2005 compiliert und eingestellt, so dass es schonmal läuft (kleinere Programme funktionierten problemlos).

Beim Umzug von meinem Projekt, bekomme ich nun leider Linker Fehler, die davor nicht existierten. Diese sehen folgendermaßen aus:

Code: Alles auswählen

link /LIBPATH:"c:\Qt\lib" /NOLOGO /DEBUG /DLL /incremental:no /OUT:"..\l
ib\Road.dll" @C:\DOKUME~1\student\LOKALE~1\Temp\nm63.tmp
LINK : fatal error LNK1181: Eingabedatei "Log.lib" kann nicht geöffnet werden.
NMAKE : fatal error U1077: ""C:\Programme\Microsoft Visual Studio\VC\BIN\link.EX
E"": Rückgabe-Code "0x49d"
Stop.
NMAKE : fatal error U1077: ""C:\Programme\Microsoft Visual Studio\VC\BIN\nmake.e
xe"": Rückgabe-Code "0x2"
Stop.
NMAKE : fatal error U1077: "cd": Rückgabe-Code "0x2"
Stop.
NMAKE : fatal error U1077: "cd": Rückgabe-Code "0x2"
Stop.
Er kann also die Log.lib nicht finden. Nun, beim normalen make (unter MinGW), hat er diese gar nicht gebraucht. Allerdings werden dlls erstellt, und keine libs. D.h., unter der im Project-File angegebenen LIB Option und dem INCLUDE Path befinden sich die dll (Log.dll) und das Header File (Log.h). Die Log.dll wurde auch anstandslos erstellt.

Der Ausschnitt des Project Files sieht so aus:

Code: Alles auswählen

INCLUDEPATH += ../../Road/src \

LIBS += -lLog -L../../Log/lib \
Weiß leider nicht mehr weiter und hoffe ihr könnte mir helfen!

Gruß,
bill

EDIT: Ach ja, ich habe jetzt natürlich nmake benutzt statt make, nur um das klar zu stellen :wink:

Verfasst: 23. März 2007 14:03
von Christian81
Ist die Log.dll von Dir? Dann hast du sicherlich vergessen die Funktionen daraus zu exportieren. MinGW braucht das nicht und kann direkt gegen eine DLL linken, aber normalerweise braucht man unter Windows eine statische Import-Lib.

Suche mal im Forum nach Q_DECL_DLLEXPORT Q_DECL_DLLIMPORT und statischen Import-Libs

Verfasst: 23. März 2007 14:26
von bill
Ja, die ist von mir!
Werde danach mal suchen und mich nochmal melden, falls ich nicht weiter komme.

Danke jedenfalls!

Verfasst: 23. März 2007 14:34
von bill
Andererseits, wenn du eine Lösung gleich weißt, wäre es nett wenn du sie mir mitteilen könntest :D

Eine erste Suche so auf die schnelle brachte keine großen Erfolge...

Verfasst: 23. März 2007 14:45
von Christian81
Jede Funktion in deiner Lib auf die man von ausserhalb zugreifen will, muss exportiert werden.

Code: Alles auswählen

#include <qglobal.h>

#ifdef Q_OS_WIN
# ifdef MAKE_FOO_LIB
#  define FOO_EXPORT Q_DECL_DLLEXPORT
# else
#  define FOO_EXPORT Q_DECL_DLLIMPORT
# endif
#else
# define FOO_EXPORT Q_DECL_DLLEXPORT
#endif
Beim Erstellen der Lib einfach MAKE_FOO_LIB in der pro-Datei definieren und schon wird die export-Lib erstellt.

Verfasst: 23. März 2007 14:59
von bill
Hmm...sorry, aber das habe ich jetzt nicht ganz verstanden:
Christian81 hat geschrieben:Jede Funktion in deiner Lib auf die man von ausserhalb zugreifen will, muss exportiert werden.

Code: Alles auswählen

#include <qglobal.h>

#ifdef Q_OS_WIN
# ifdef MAKE_FOO_LIB
#  define FOO_EXPORT Q_DECL_DLLEXPORT
# else
#  define FOO_EXPORT Q_DECL_DLLIMPORT
# endif
#else
# define FOO_EXPORT Q_DECL_DLLEXPORT
#endif
Dass muss ich dann in jeder Datei schreiben, die auf die Library Funktionen zugreifen muss??
Beim Erstellen der Lib einfach MAKE_FOO_LIB in der pro-Datei definieren und schon wird die export-Lib erstellt.
Und wie mache ich das?? ;)

Gibt's denn keine andere Möglichkeit?? Und wird das eventuell die portabilität des Programms beeinträchtigen? Bis jetzt läuft es nämlich sowohl unter Linux als auch unter Windows, und das soll natürlich so bleiben.

Besten dank nochmal, dass du mir weiterhilfst!

Verfasst: 23. März 2007 15:39
von Christian81
Diese Definition sollte in eine globale Headerdatei - z.B. foo_export.h oder so

Wie du das definierst? Ich würde sagen RTM: http://doc.trolltech.com/4.2/qmake-vari ... ml#defines

Und portabel ist es natürlich auch - oder warum mache if #ifdef Q_OS_WIN? Unter Linux unterstützt das der gcc seit Version 4.2 auch in ähnlicher Form.

Verfasst: 23. März 2007 18:16
von bill
So, habe das nun ausprobiert...leider ohne Erfolg :(

Ich habe wie von dir Beschrieben erstmal im Project file der DLL hinzugefügt:

Code: Alles auswählen

DEFINES += CREATE_STATIC_LIBRARY
Danach habe ich in die header Datei der dll (besteht nur aus einer cpp und einer header datei) folgendes reingeschrieben:

Code: Alles auswählen

#include <qglobal.h>

#ifdef Q_OS_WIN
# ifdef CREATE_STATIC_LIBRARY
#  define FOO_EXPORT Q_DECL_EXPORT
# else
#  define FOO_EXPORT Q_DECL_IMPORT
# endif
#else
# define FOO_EXPORT Q_DECL_EXPORT
#endif 
Ergebnis: lib wird nicht erstellt, nur die dll...

Gruß,
bill

Verfasst: 23. März 2007 18:22
von Christian81
Ich bin auch doof - natürlich habe ich vergessen zu sagen dass Du das Macro auch vor die Klassen schreiben musst die Du exportieren willst... *grml*

Code: Alles auswählen

class FOO_EXPORT myClass
{
};

FOO_EXPORT void myFunction();

Verfasst: 23. März 2007 18:36
von bill
Neee doof biste nich :lol:

Klappt immer noch nicht :) Der erkennt das Makro irgenwie nicht...kommt 'ne Latte von Fehlermeldungen...

Habe nochmal google wegen Q_DECL_DLLEXPORT bemüht, aber viel kommt dabei nicht raus...heißt das vielleicht irgendwie anders??

Verfasst: 23. März 2007 18:51
von Christian81
Ja, nämlich Q_DECL_EXPORT/Q_DECL_IMPORT (siehe qglobal.h) - habe es oben auch korrigiert.
Irgendwie wird es wohl Zeit das wieder Wochenende ist... :)

Verfasst: 23. März 2007 18:58
von bill
Yeah, hat geklappt!
Super, danke schön!

Schade aber, dass es keine Möglichkeit gibt das hinzubekommen, ohne den Code ändern zu müssen...

Und wegen Wochenende...das ist ja gleich ;)