Wie jpg in Visual Studio 2010 einbinden?
-
Hallo zusammen,
folgendes ich Versuche gerade einfach QImages mit jpeg zubenutzen. Das klappt nicht. Recherchen ergaben das man wohl das Plugin qjpeg4.lib (oder dll??) hinzufügen muss. Allerdings habe ich keinen blassen Schimmer wie das in dem Fall gehen soll. Was ich bisher probiert habe:in der main.cpp:
@
#include <QtPlugin>Q_IMPORT_PLUGIN(qjpeg)
@dazu habe ich versucht in Additional Dependencis folgendes anzugeben:
qjpeg4.liballerdings resultiert das immer noch in:
error LNK2019: unresolved external symbol "class QObject * __cdecl qt_plugin_instance_qjpeg(void)" (?qt_plugin_instance_qjpeg@@YAPAVQObject@@XZ) referenced in function "public: __thiscall StaticqjpegPluginInstance::StaticqjpegPluginInstance(void)" (??0StaticqjpegPluginInstance@@QAE@XZ)die qjped4.lib liegt in QTDIR\plugins\imageformats.
Muss ich eventuell beim initialien kompilieren von QT bestimmte Flags setzen?
Wie ist der übliche Weg?
Wäre für Tips sehr dankbar!
Danke Marc[EDIT: code formatting, Volker]
-
Hi,
die plugins linmks dui nicht, doie werden zur laufzeit geladen.
Schau mal in den distribution guides in der doku nach.Siehe auch folgende forum links:
- "Systray icons don’t show up":http://developer.qt.nokia.com/forums/viewthread/12563/
- "deploying on windows XP":http://developer.qt.nokia.com/forums/viewthread/10492/
- "JPEG Support":http://developer.qt.nokia.com/forums/viewthread/1019/
- "Packaging Qt applications on desktop platforms.":http://developer.qt.nokia.com/forums/viewthread/4498/
- "Images Not Showing in Deployment.":http://developer.qt.nokia.com/forums/viewthread/4381/
-
Q_IMPORT_PLUGIN braucht man nur, wenn man statisch gegen Qt linked, wovon ich abrate.
Zum Deployment braucht man nur die DLLs, die .lib-Dateien bitte weglassen. Wichtig ist dann noch, dass die Dateistruktur stimme: plugins-Verzeichnis, und darunter das Verzeichnis imageformats und darin dann die qjpeg4.dll. Ggf. muss der Library-Path in der Anwendung noch gesetzt werden.
-
Vielen dank für die Informationen.
Also wenn ich alles richtig verstehe ist alles was ich tun sollte:- Lege in dem Verzeichnis in dem die Applikations exe liegt den plugins ordner und den imageformats an
2.Kopiere aus QTDir\Plugins\imageformats qjep4.dll bzw qjpegd4.dll (ich nehme an die ist fürs debuggen)in diesen Ordner - Mit der addLibraryPath diesen Unterordner (imageformats) angeben.
Habe ich das richtig verstanden?
Werde es gleich mal ausprobieren, sobald ich am richtigen Rechner bin.
Verstehe ich etwas falsch wenn ich annehme das QT ja eigentlich den plugins Ordern im QTDIR kennt aber diese dlls nicht lädt weil ich nicht alle Plugins immer laden möchte?
Vielen Dank
MarcUpdate:
Das scheint bei mir aus mir unbekannten Gründen nicht zu funktionieren, ich sehe in der Debug Ausgabe von VS2010 das die dlls nicht geladen werden, zumindest tauchen sie da nicht auf. Muss ich außer der QApplication::addLibraryPath() Methode noch andere Sachen aufrufen damit die Library zumindest versucht wird zuladen? Eben wurde die dll einmal geladen aber das brachte leider auch nicht das gewünschte Ergebnis und jetzt werden die dlls wieder nicht versucht zu laden laut debug ausgabe (ich habe zumindest bewusst nichts geändert).
Vielleicht mal kurz zu meiner Umgebung, ich benutze VS2010 Ultimate (Studenten Lizenz) auf einem 64 bit WIndows 7 proffesional, QT4.8 selber kompiliert mit VS und den Optionen "configure -platform win32-msvc2010 -shared".Vielen Dank
Marc - Lege in dem Verzeichnis in dem die Applikations exe liegt den plugins ordner und den imageformats an
-
Soweit fast alles richtig, allerdings musst Du bei addLibraryPath das "imageformats" weglassen, Qt ergänzt die Unterverzeichnisse passend zum benötigten Plugin-Typ (imageformats, sqldrivers, etc.). So muss man den Pfad nur einmal setzen.
Ansich sollten zumindest auf der Entwicklungs-Maschine die Plugins auch aus dem Qt-Verzeichnis geladen werden. Beim Installieren auf einer Benutzer-Maschine geht das dann natürlich nicht mehr.
Ob die Plugins geladen werden, kannst Du in der main() methode überprüfen:
@
#include <QImageReader>// Library-Path anpassen
// so ist es egal, wo die Anwendung am Ende installiert ist
QString myPath = qApp->app.applicationDirPath() + "/plugins";
QCoreApplication::addLibraryPath(myPath);qDebug() << QImageReader::supportedImageFormats();
@ -
Danke für die Hinweise,
leider bisher kein Erfolg.
Die Ausgabe der supportedImages ist folgendes:
("bmp", "pbm", "pgm", "png", "ppm", "xbm", "xpm")Habe eben aus lauter Frust mal alle dlls des imageformats Ordner rüber kopiert und scheinbar geht keine von diesen da die obige Ausgabe genau die selbe bleibt. Der Ouput des Debugs zeigt dabei folgendes:
'FirstAssignment.exe': Loaded 'D:\Uni\IPCG\VS2010\FirstAssignment\plugins\imageformats\qgif4.dll', Binary was not built with debug information.
'FirstAssignment.exe': Unloaded 'D:\Uni\IPCG\VS2010\FirstAssignment\plugins\imageformats\qgif4.dll'
'FirstAssignment.exe': Loaded 'D:\Uni\IPCG\VS2010\FirstAssignment\plugins\imageformats\qgifd4.dll', Symbols loaded.
'FirstAssignment.exe': Unloaded 'D:\Uni\IPCG\VS2010\FirstAssignment\plugins\imageformats\qgifd4.dll'das geht soweiter für fast alle dlls nur die jpeg4.dll und jpegd4.dll tauch erst ganricht auf.
Was sagt mir "Binary was not built with debug information."?? Tritt sowohl auf wenn ich debug kompiliere als auch im release Modus von VS 2010. Muss ich QT mit debug kompilieren? Kann ja eigenlich nicht sein das es nur so geht. Auch komisch das sofort alles wieder "unloadet" wird.
Und ich habe das Problem ja aktuell genau auf dem Rechner auf dem auch QT ist also ich denke noch nicht mal dran das auf einem anderen Rechner zu versuchen. Ich muss irgendwas grob fasch machen scheint es mir, aber ich weiss einfach nicht was.
Bin für Tipps was ich noch versuchen könnte ich dankbar!
Wenn weitere Informationen gebraucht werden stelle ich die gerne zur Verfügung ich bin nur zur zeit etwas ratlos wo genau ich noch nach dem Problem suchen soll.
Vielen Dank
Marc -
Die qxxxd4.dll DLLs sind die Debug-Versionen. Normalerweise holt sich Qt die passende Version.
Du hast Qt nicht zufällig als statische Bibliothek compiliert?
-
Also wenn ich es richtig verstehe wäre das der Parameter -static beim "configure" gewesen, diesen habe ich nie verwendet. Meist ganz ohne Paramter bezüglich static oder dynamic(shared), da shared der default sein sollte. Habe es aber auch schon mit shared probiert.
Mein typischer configure sieht so aus “configure -platform win32-msvc2010 -shared” oder sollte es ein win64 sein? Wobei ich eigentlich immer alles mit 32 bit mache aber ich habe ein 64 bit WIndows 7. -
Hatte auch ein ähnliches problem. Hast du mal versucht das ganze nicht im debug sondern im release mode auszuführen. Bei mir werden die Bilder nur im release mode angezeigt im debug mode komischerweise nicht. habe mich nicht mehr weiter drum gekümmert, da release für mich reicht = )
-
Ja habe ich, das ist das Problem, mir fällt nichts mehr ein was ich noch versuchen kann, außer auf visual studio zu verzichten und eventuell auf ubuntu oder so zu wechseln.
Ich bin ratlos... werde nochmal versuchen qt neuzu kompilieren aber das habe ich nn auch schon ein paar mal.
Für Tips bin ich dankbar! -
Wen ich versuche eine jpg Datei zu öffnen, als Konstrukter für QImage, folgendes wird ausgegeben:
'FirstAssignment.exe': Loaded 'C:\Windows\SysWOW64\PhotoMetadataHandler.dll', Cannot find or open the PDB file
'FirstAssignment.exe': Loaded 'ImageAtBase0x8350000', Loading disabled by Include/Exclude setting.
'FirstAssignment.exe': Unloaded 'ImageAtBase0x8350000'
'FirstAssignment.exe': Loaded 'ImageAtBase0x7f60000', Loading disabled by Include/Exclude setting.
'FirstAssignment.exe': Unloaded 'ImageAtBase0x7f60000'
'FirstAssignment.exe': Unloaded 'C:\Windows\SysWOW64\msftedit.dll'Vielleicht kann jemand damit was anfangen.
Danke
Marc -
So tief bin ich bei Windows/Visual Studio leider nicht in der Materie, ich steig' hier mal aus.
Eine Alternative für Windows wäre noch der Einsatz von MinGW - das sind die GNU-Compiler für Windows. Funktioniert prima, wir haben VS gerade mit MinGW ersetzt.
-
Ja, werde ich mal tun, unter Ubuntu läuft auch alles wie es sollte. Trotzdem gan komische Sache... naja vielen Dank für die Mühe und falls doch noch eine Lösung auftaucht poste ich das hier.
Marc -
Der Thread ist vllt ein wenig eingestaubt aber ich hab zu dem Thema auch ne Frage.
Gibt es eine Möglichkeit images anzeigen zu lassen ohne die plugin dll mitzuliefern oder die images in die Root folder der Anwendung zu kopieren??
Sodass ich nur folgende Dateien mitzuliefern habe?
@<Anwendungsname>.exe
bq. QtCore4.dll
QtGui4.dll@und nicht
@<Anwendungsname>.exe
QtCore4.dll
QtGui4.dll
imageformats/qjpeg4.dll@Denn ich habe jetzt das Problem die .exe Datei selber hat einen Icon für jede erdenkliche Größe.
Der Icon sitzt einmal in der .rc Datei und einmal in der .qrc datei aber nur der aus der .rc datei wird berücksichigt.
Auch das kopieren des qico4.dll Pluginsn brachte in diesem Punkt keinen erfolg.PS: Ich verwende Qt 4.8.1 mit Visual Studio 2010 Professional SP1 mit VS-Addin 1.1.10
-
Nein, ohne die imageformats plugins geht es nicht. Die müssen entweder zentral installiert sein oder eben beim Programm liegen.
Ich weiss jetzt nicht, ob es möglich statische plugins gegen eine dynamische Qt-Bibliothek zu bauen. Das habe ich nie probiert, lohnt meiner Meinung nach den Aufwand auch nicht wirklich. Mit komplett statischer Qt-Bibliothek ginge es zwar wohl, aber dann muss man lizentechnisch aufpassen (GPL-"Infektion").