Seite 1 von 1

lib in MSVC übersetzen

Verfasst: 22. Mai 2007 15:59
von taraquedo
Hallo!

Ich brauche für mein Projekt die qextserialport, welche plattformunabhängig die Kommunikation mit der seriellen Schnittstelle herstellt. Unter Linux ist das gar kein Problem. qmake; make und das Beispielprojekt ist übersetzt, wenn man zuvor die libs kopiert hat.

Unter Windows verwende ich MS Visual Studio 2005 und ich kriege es nicht gebacken, wie ich da jetzt eine lib rauskriegen muss. qmake und dann nmake macht alles, aber nicht die lib übersetzen. Heißt das unter Windows DLL? Ich bin total verwirrt. Ich würde gerne wissen, wie man so eine Qt-kompatible lib erzeugt und dann auch später im Projekt nutzt. Gibt es dazu vielleicht irgendwo eine Anleitung, die mich da mal durchführt? Es muss ja nicht notwendigerweise die qextserialport sein, aber eine Qt-Lib muss es wohl schon sein, wegen der vielen Einstellerei in VS.

Kann mir da jemand helfen?

Grüße!

Verfasst: 22. Mai 2007 16:32
von Volker
QMake funktioniert doch auch unter Windows. Du kannst dir sogar ein Visual Studio Projekt generieren lassen. Aber wenn nmake keinen Fehler liefert, sollte irgendwo schon die lib oder DLL Datei erzeugt worden sein.

Lib Dateien bezeichnen normalerweise statische gelinkte Bibliotheken bzw. bei DLLs gibt es unter Visual Studio auch lib Dateien, die die exportierten Verweise auf die DLL enthalten.

Gibt es bei dir denn einen Fehler beim ausführen von nmake?

Verfasst: 22. Mai 2007 16:38
von taraquedo
Hallo!
NMAKE : fatal error U1077: ""C:\Programme\Microsoft Visual Studio 8\VC\bin\cl.EXE"": Rückgabe-Code "0x80"
Das ist alles, nachdem ich qmake erfolgreich bereits ausgeführt hatte. nmake liefert dann das.

Ich habe gerade einen Artikel gelesen, bei dem man mit MinGW kompiliert und die fertige lib dann irgendwie in MSVC nutzt.

Also wenn ich das richtig verstanden habe, dann gibt es unter win dynamische dll dateien. Um die zu nutzen brauche ich eine kleine lib-Datei mit Verweisen, was in der dll steht. Und es gibt auf der anderen Seite statische lib's, die keine dll Datei erzeugen und der Code der lib dann komplett in der Anwendung landet.

Wie bekomme ich raus, welches dieser Formen qextserialport nutzt? Denn die Anleitung geht nur mit dll-Dateien.

Grüße!

Verfasst: 22. Mai 2007 16:42
von Volker
Die Fehlermeldung allein sagt leider nicht viel aus. Scheinbar gab es ein Problem beim Ausführen von cl.exe

Steht da nicht noch mehr? Evtl. sind irgendwelche Pfade nicht gesetzt. Hast du die VS Console gestartet bevor du nmake aufgerufen hast?

Verfasst: 22. Mai 2007 19:17
von taraquedo
Ahhh. Vielen Dank! Das war ja richtig einfach. Mit der richtigen Konsole, sprich den richtigen Einstellungen lief nmake durch ohne Widerworte. Aber....

Jetzt habe ich als Compilat die qextserialport.dll bekommen (zusammen mit einer manifest-Datei, dessen Bedeutung mir nicht klar ist). Wenn ich nun auf gleiche Weise versuche das Testprojekt zu übersetzen, dann beschwert er sich darüber, dass er die qextserialport.lib nicht finden kann, die ich ja auch nicht habe. Wie kann ich die jetzt noch erzeugen?

P.S.: Vorher beschwert er sich bereits über folgendes:
.\MessageWindow.cpp(93) : error C2061: Syntaxfehler: Bezeichner '{ctor}'
Die Programmzeile lautet jedoch:

Code: Alles auswählen

if (static_cast<MessageWindow::EventType>(event->type()) == MessageWindow::MessageEvent)
		msgTextEdit.append(dynamic_cast<MessageEvent::MessageEvent* >(event)->msg);
Da kommt {ctor} ja nicht einmal drin vor. Dreht er jetzt durch? Ich habe die Zeile erstmal auskommentiert, um ein Problem weniger zu haben ;-)

Verfasst: 22. Mai 2007 22:01
von Volker
Das ist in der Tat etwas seltsam:
Beheben lässt sich das Problem, indem man die Enumeration von MessageEvent in z.B. MessageEventType umbenennt und entsprechend die Stellen in customEvent(QEvent* event) und im Konstruktor von MessageEvent ändert. Seltsam finde ich, dass ja eigentlich explizit der Klassenname im Sourcecode steht. Evtl. ein Bug im MS Compiler? Na egal, lässt sich ja recht leicht beheben.

Bei der DLL-Lib Geschichte ist das Problem, dass keinerlei Export Anweisungen für ne DLL im Code stehen. Schnelle Lösung: einfach ein

CONFIG += staticlib

in die qextserialport.pro einfügen und gegen die resultierende statische Bibliothek linken.

[gelöst] lib in MSVC übersetzen

Verfasst: 24. Mai 2007 12:14
von taraquedo
Juchu es klappt!

Zwar funktioniert die Korrektur am Beispielcode bei mir nicht - der Compiler schimpft immer noch, aber darauf aufbauend habe ich mir gerade eine rudimentäres Programm mit serieller Schnittstelle geschrieben.
Hoffentlich bekomme ich da keine Schwierigkeiten, wenn ich da nun Threads benutzte. Die braucht man nämlich, weil das Signal readyRead nicht ausgelöst wird.

Grüße!