Ultra-Newbie: Linkerproblem

Dein Thema passt einfach in kein Forum? Dann probiers mal hier.
Antworten
OlafSt
Beiträge: 5
Registriert: 6. September 2010 10:09

Ultra-Newbie: Linkerproblem

Beitrag von OlafSt »

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 :wink: 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ß :wink:)

Danke euch im voraus !

Olaf
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

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.
OlafSt
Beiträge: 5
Registriert: 6. September 2010 10:09

Beitrag von OlafSt »

Danke für den Hinweis - funktioniert aber nicht. Fehlermeldung: "Cannot find -llibole32" :evil:

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 :shock:
"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 :lol:

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 !
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

-llibole32 -> -lole32
Beim Linken darfst du den "lib"-Präfix nicht mit angeben, dachte das ging aus meinem Beispiel klar hervor.
OlafSt
Beiträge: 5
Registriert: 6. September 2010 10:09

Beitrag von OlafSt »

Ha, es funktioniert !!!

Tut mir leid, das mit dem "lib" habe ich tatsächlich übersehen. Betriebsblind, sry.

Danke fürs helfen !
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

OlafSt
Beiträge: 5
Registriert: 6. September 2010 10:09

Beitrag von OlafSt »

Das habe ich auch gelesen :wink:

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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

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 ...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

OlafSt hat geschrieben:Das habe ich auch gelesen :wink:

Doch wo steht in den paar Zeilen, das das "lib" vorne dran weggelassen werden muß ?
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.

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 ;)
OlafSt
Beiträge: 5
Registriert: 6. September 2010 10:09

Beitrag von OlafSt »

Wie ich schon erwähnte... Ich hab mit Linux echt nix am Hut, und jetzt dürften es auch alle gemerkt haben :lol:

Danke für die Aufklärung, wenns wieder mal hakt, weiß ich ja, wen ich fragen kann 8)
Antworten