Ultra-Newbie: Linkerproblem
Ultra-Newbie: Linkerproblem
Hallo Leute,
ich hoffe, ich bekomme hier einen Schubser mehr als in den anderen QT-Foren, wo man einfach im Regen stehengelassen wird... Weiterhin habe ich keine wirklich passende Kategorie gefunden, also habe ich es vorsichtshalber im "Sonstiges" platziert.
Vorab, ich bin ein blutiger Anfänger in Sachen Qt, aber kein Anfänger in Sachen Programmieren Bisher habe ich beruflich viel mit Delphi gearbeitet und auch einige Jahre mit dem C++ Builder. Die Welt von Qt ist mir also gänzlich neu- und ich bin ein Windows-Benutzer, der mit Linux nix am Hut hat.
Ich habe mir kürzlich das Qt-Package von Nokia gesaugt (http://qt.nokia.com/downloads/sdk-windows-cpp) und auch easy installiert und zum laufen bekommen. Innerhalb meines ersten Projektes möchte ich gern "CoInitializeEx" aufrufen - doch dies klappt einfach nicht.
Anfangs bekam ich die Fehlermeldung "undefined reference to CoInitializeEx@8". In den Foren gefragt bekam ich die Antwort, das libole32 nicht gelinkt wird und ich möge doch bitte die Doku zu LIBS im Makefile lesen.
Hab ich getan, da steht was von "-L" für Pfade und "-l" für konkrete Libs. Ein einfaches "-L[Pfad]" löste mein Problem nicht. Die Angabe von "-llibole32" (auch in Abwandlung als libole32.a, relativer Pfadanagabe, absoluter Pfadangabe) führt zur Fehlermeldung "No such file or directory".
Ab hier stehe ich im Regen, niemand antwortet mir mehr.
Weiß hier jemand, was ich wo modifizieren muß ? Ich bin ja lernfähig und weiß beim nächsten mal, was zu tun ist (und frage höchstens, welche Lib ich nehmen muß )
Danke euch im voraus !
Olaf
ich hoffe, ich bekomme hier einen Schubser mehr als in den anderen QT-Foren, wo man einfach im Regen stehengelassen wird... Weiterhin habe ich keine wirklich passende Kategorie gefunden, also habe ich es vorsichtshalber im "Sonstiges" platziert.
Vorab, ich bin ein blutiger Anfänger in Sachen Qt, aber kein Anfänger in Sachen Programmieren Bisher habe ich beruflich viel mit Delphi gearbeitet und auch einige Jahre mit dem C++ Builder. Die Welt von Qt ist mir also gänzlich neu- und ich bin ein Windows-Benutzer, der mit Linux nix am Hut hat.
Ich habe mir kürzlich das Qt-Package von Nokia gesaugt (http://qt.nokia.com/downloads/sdk-windows-cpp) und auch easy installiert und zum laufen bekommen. Innerhalb meines ersten Projektes möchte ich gern "CoInitializeEx" aufrufen - doch dies klappt einfach nicht.
Anfangs bekam ich die Fehlermeldung "undefined reference to CoInitializeEx@8". In den Foren gefragt bekam ich die Antwort, das libole32 nicht gelinkt wird und ich möge doch bitte die Doku zu LIBS im Makefile lesen.
Hab ich getan, da steht was von "-L" für Pfade und "-l" für konkrete Libs. Ein einfaches "-L[Pfad]" löste mein Problem nicht. Die Angabe von "-llibole32" (auch in Abwandlung als libole32.a, relativer Pfadanagabe, absoluter Pfadangabe) führt zur Fehlermeldung "No such file or directory".
Ab hier stehe ich im Regen, niemand antwortet mir mehr.
Weiß hier jemand, was ich wo modifizieren muß ? Ich bin ja lernfähig und weiß beim nächsten mal, was zu tun ist (und frage höchstens, welche Lib ich nehmen muß )
Danke euch im voraus !
Olaf
Angenommen, deine Lib heißt
/home/olaf/libs/libmyshared.so
Dann schaut machst du das so:
-L/home/olaf/libs/ -lmyshared
Das -L gibt keinen "Pfad samt lib" an, sondern das Verzeichnis, in dem die lib liegt. Ist das Verzeichnis deinem Linker nicht als Suchpfad bekannt, musst du das beim Linken (oder im .pro) mit angeben.
/home/olaf/libs/libmyshared.so
Dann schaut machst du das so:
-L/home/olaf/libs/ -lmyshared
Das -L gibt keinen "Pfad samt lib" an, sondern das Verzeichnis, in dem die lib liegt. Ist das Verzeichnis deinem Linker nicht als Suchpfad bekannt, musst du das beim Linken (oder im .pro) mit angeben.
Danke für den Hinweis - funktioniert aber nicht. Fehlermeldung: "Cannot find -llibole32"
Ich habe die Dateien "Makefile.Debug" und "Makefile.Release" modifiziert. Der dort zu findende LIBS-Eintrag sieht nun so aus:
CC = gcc
CXX = g++
DEFINES = -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN
CFLAGS = -g -Wall $(DEFINES)
CXXFLAGS = -g -frtti -fexceptions -mthreads -Wall $(DEFINES)
INCPATH = -I"..\..\Qt\2010.04\qt\include\QtCore" -I"..\..\Qt\2010.04\qt\include\QtGui" -I"..\..\Qt\2010.04\qt\include" -I"..\..\Qt\2010.04\qt\include\ActiveQt" -I"debug" -I"." -I"..\Test01" -I"." -I"..\..\Qt\2010.04\qt\mkspecs\win32-g++"
LINK = g++
LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows
LIBS = -L"d:\Qt\2010.04\qt\lib" -L"d:\Qt\2010.04\mingw\lib" -lmingw32 -lqtmaind -lQtGuid4 -lQtCored4 -llibole32
QMAKE = d:\qt\2010.04\qt\bin\qmake.exe
IDC = d:\Qt\2010.04\qt\bin\idc.exe
IDL = midl
<snipped dozens of more lines obviously not of interest>
Meine Änderungen habe ich mal markiert.
In der .pro-Datei gibt es keinen LIBS-Entry, ich wüßte also nicht, wo ich dort etwas ändern müßte. Überhaupt ist das ganze mysteriös: Im LIBS-Eintrag sind mit -l vier Bibliotheken angegeben: mingw32, qtmaind, qtguid4 und qtcored4. Suche ich nach "mingw32", gibt es so eine Datei auf meiner ganzen Festplatte nicht, weder DLL, noch .a noch .so noch .lib
"qtmaind" finde ich Plattenweit eine ".PRL"... "qtmaind" und "qtcored4" gibt es als .DLL
Die gefragte libole32 finde ich als ".a" im Verzeichnis "D:\qt\2010.04\mingw\lib" - ich denke mal, das ist die gesuchte Bibliothek, in der sich mein CoInitializeEx befindet.
Ich will ja gar nicht alles verstehen (das kommt von allein) aber wenigstens ein bisschen
Wenn gewünscht, zippe ich auch das ganze Projekt mal ein und lade das hier hoch, falls mein Geschreibsel da völlig unverständlich ist.
Nochmal danke im voraus, das ihr einem helft, der ein echt dickes Brett vor dem Kopf hat !
Ich habe die Dateien "Makefile.Debug" und "Makefile.Release" modifiziert. Der dort zu findende LIBS-Eintrag sieht nun so aus:
CC = gcc
CXX = g++
DEFINES = -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_GUI_LIB -DQT_CORE_LIB -DQT_THREAD_SUPPORT -DQT_NEEDS_QMAIN
CFLAGS = -g -Wall $(DEFINES)
CXXFLAGS = -g -frtti -fexceptions -mthreads -Wall $(DEFINES)
INCPATH = -I"..\..\Qt\2010.04\qt\include\QtCore" -I"..\..\Qt\2010.04\qt\include\QtGui" -I"..\..\Qt\2010.04\qt\include" -I"..\..\Qt\2010.04\qt\include\ActiveQt" -I"debug" -I"." -I"..\Test01" -I"." -I"..\..\Qt\2010.04\qt\mkspecs\win32-g++"
LINK = g++
LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -mthreads -Wl -Wl,-subsystem,windows
LIBS = -L"d:\Qt\2010.04\qt\lib" -L"d:\Qt\2010.04\mingw\lib" -lmingw32 -lqtmaind -lQtGuid4 -lQtCored4 -llibole32
QMAKE = d:\qt\2010.04\qt\bin\qmake.exe
IDC = d:\Qt\2010.04\qt\bin\idc.exe
IDL = midl
<snipped dozens of more lines obviously not of interest>
Meine Änderungen habe ich mal markiert.
In der .pro-Datei gibt es keinen LIBS-Entry, ich wüßte also nicht, wo ich dort etwas ändern müßte. Überhaupt ist das ganze mysteriös: Im LIBS-Eintrag sind mit -l vier Bibliotheken angegeben: mingw32, qtmaind, qtguid4 und qtcored4. Suche ich nach "mingw32", gibt es so eine Datei auf meiner ganzen Festplatte nicht, weder DLL, noch .a noch .so noch .lib
"qtmaind" finde ich Plattenweit eine ".PRL"... "qtmaind" und "qtcored4" gibt es als .DLL
Die gefragte libole32 finde ich als ".a" im Verzeichnis "D:\qt\2010.04\mingw\lib" - ich denke mal, das ist die gesuchte Bibliothek, in der sich mein CoInitializeEx befindet.
Ich will ja gar nicht alles verstehen (das kommt von allein) aber wenigstens ein bisschen
Wenn gewünscht, zippe ich auch das ganze Projekt mal ein und lade das hier hoch, falls mein Geschreibsel da völlig unverständlich ist.
Nochmal danke im voraus, das ihr einem helft, der ein echt dickes Brett vor dem Kopf hat !
Das habe ich auch gelesen
Doch wo steht in den paar Zeilen, das das "lib" vorne dran weggelassen werden muß ?
Wenn ich eine Datei angebe, mit der irgendwas angestellt werden soll (sei es nun löschen, kopieren oder linken), dann muß ich stets den gesamten Dateinamen samt Pfad angeben - in diesem Falle also "libole32.a". Das Weglassen des Pfads und der Extension ist ja nichts ungewöhnliches, aber das Weglassen von Teilen des Filenamens (so das nur noch "ole32.a" angegeben werden muß) ist mir in all den Jahren Windows-Praxis noch nie untergekommen.
Doch wo steht in den paar Zeilen, das das "lib" vorne dran weggelassen werden muß ?
Wenn ich eine Datei angebe, mit der irgendwas angestellt werden soll (sei es nun löschen, kopieren oder linken), dann muß ich stets den gesamten Dateinamen samt Pfad angeben - in diesem Falle also "libole32.a". Das Weglassen des Pfads und der Extension ist ja nichts ungewöhnliches, aber das Weglassen von Teilen des Filenamens (so das nur noch "ole32.a" angegeben werden muß) ist mir in all den Jahren Windows-Praxis noch nie untergekommen.
Ja hier prallen 2 Welten aufeinander ...
der gcc (mingw) kommt halt aus der unix welt, da iss das so üblich. da funktionieren einige mechanismen z.b. auch nur wenn eine dyn. Bibliothek lib[Name].[Major].[Minor].[Release].so heisst(die LD Geschichte). so auch der linker, der davon ausgeht, das ne statische lib immer lib[Name].a heisst.
unter core windows gibts sowas ned. deshalb vertragen die M$ und Intel compiler / linker, die zwar mit den selben flags arbeiten, die vollstaendigen Namen.
Libs unter windows erkennt man auch eindeutig an der Extension (*.lib). Die gibts fuer nix anderes.
unter unix ist .a eigentlich nur ein archiv. Das es sich bei .a um ein archiv aus ein oder mehreren .obj handelt, muss man eben mit dem lib davor kennzeichen.
Ciao ...
der gcc (mingw) kommt halt aus der unix welt, da iss das so üblich. da funktionieren einige mechanismen z.b. auch nur wenn eine dyn. Bibliothek lib[Name].[Major].[Minor].[Release].so heisst(die LD Geschichte). so auch der linker, der davon ausgeht, das ne statische lib immer lib[Name].a heisst.
unter core windows gibts sowas ned. deshalb vertragen die M$ und Intel compiler / linker, die zwar mit den selben flags arbeiten, die vollstaendigen Namen.
Libs unter windows erkennt man auch eindeutig an der Extension (*.lib). Die gibts fuer nix anderes.
unter unix ist .a eigentlich nur ein archiv. Das es sich bei .a um ein archiv aus ein oder mehreren .obj handelt, muss man eben mit dem lib davor kennzeichen.
Ciao ...
Sowas weiß man Du verwendest mingw, das ist gcc + ld + <...>, halt was man so unter Linux/Unix verwendet. Qt kann ja auch nicht für jedes Feature bei Adam und Eva anfangen. Operator-Überladung, RegExp oder anderes "Allgemeinwissen" die Programmiereung betreffend werden in dem Umfang vorausgesetzt, wie Qt keine Spezialitäten betreibt.OlafSt hat geschrieben:Das habe ich auch gelesen
Doch wo steht in den paar Zeilen, das das "lib" vorne dran weggelassen werden muß ?
Und wen du MinGW (und damit gcc, ld, ..) verwendest, musst du halt auch schauen, wie man die bedient. Aber hast ja gesehen - gibts Probleme kennt iregendwer eine Lösung