Hallo Leute,
ich habe gerade ein kleines Verständnisproblem. Ich würde gerne in einem
Projekt .dll-Dateien dynamisch zu linken. Es handelt sich um ein Eclipse
Projekt, wo ich ein Programm mit dem GTK-Framework erstellt habe.
Ich habe nun das Problem, dass ich mit pkg-config mir die libs ausgeben
lassen habe, diese in den Einstellungen mit angegeben habe und der
Compiler sie etzt aber nicht findet.
Parameter:
-lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0
-lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo
-lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl
Ausgabe:
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lgtk-win32-2.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lgdk-win32-2.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -latk-1.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lgio-2.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lpangowin32-1.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lpangocairo-1.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lgdk_pixbuf-2.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lpango-1.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lcairo
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lgobject-2.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lgmodule-2.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lgthread-2.0
c:/program
files/mingw/bin/../lib/gcc/mingw32/4.6.2/../../../../mingw32/bin/ld.exe:
cannot find -lglib-2.0
Dateien:
libgtk-win32-2.0-0.dll
libgdk-win32-2.0-0.dll
...
Interessant ist, dass bei der Angabe von -lgtk-win32-2.0-0 mit dem
Suffix -0 die Bibliothek gefunden wird. Wieso muss der Compiler den
vollständigen Namen kennen? Sowei ich weiß werden Dateiversionen vom
Compiler automatisch erkannt. Es hatte auch bis zu einer
Windows-Neuinstallation so funktioniert. Habe ich eine wichtige Angabe
vergessen?
Vielen Dank,
Benny
Dlls werden dynamisch gelinkt, also genau nicht von ld.
Das macht der Programmlader des Betriebssystems, wenn das Programm
ausgeführt wird, oder sogar das Programm selber über
LoadLibrary/GetProcAddress.
Du willst vermutlich die erste Variante verwenden, dann musst Du mit den
zu den DLLs gehörenden Importlibraries linken.
> Interessant ist, dass bei der Angabe von -lgtk-win32-2.0-0 mit dem> Suffix -0 die Bibliothek gefunden wird.
Dann wird ziemlich sicher nicht auf die DLL, sondern auf die zugehörige
Importlibrary zugegriffen, die nämlich endet entweder auf .lib oder auf
.a
Ich habe keine .a oder .lib-Dateien vorliegen. Wie du schon richtig
sagtest möchte ich zur Kompilierzeit sagen auf welche Referenzen/Symbole
in welchen dlls er die Funktionsaufrufe linken muss, die er dann
automatisch bei Programmstart laden muss. Das muss ld ja trotzdem
wissen. Mir ist es nicht klar, warum der Linker die Datei nicht findet,
wenn das -0 Suffix am Lib-Namen fehlt. Muss ich ihm noch mitteilen, dass
es sich um dynamische Bibliotheken handelt? Macht er da überhaupt ein
Unterschied?
Benny schrieb:> Muss ich ihm noch mitteilen, dass> es sich um dynamische Bibliotheken handelt? Macht er da überhaupt ein> Unterschied?
es geht nicht one eine lib (.a) datei. Oder du musst es im Programmcode
mit LoadLibrary und GetProcAddress machen. Dann muss der link gar nichts
davon wissen.
Peter II schrieb:> es geht nicht one eine lib (.a) datei.
Würde mich wundern, entspricht nicht dem, wie der GNU-Linker sonst
arbeitet (unter Unix). Dort benötigt man nur entweder eine
statische Bibliothek oder eine dynamische. Sowie man eine
statische Bibliothek (.a) auf der Kommandozeile angibt, wird diese
auch statisch gelinkt.
Benny, gib' doch mal die Option -v mit an, dann sollte er etwas
gesprächiger werden.
Benny schrieb:> Parameter:> -lgtk-win32-2.0 -lgdk-win32-2.0 ...
Es fehlen die Angaben, wo die DLL-Dateien sind, z.B. per -L Flag.
Dieses muss man aus der Ausgabe von pkg-config mitkopieren.
Benny schrieb:> Sowei ich weiß werden Dateiversionen vom> Compiler automatisch erkannt.
Unter UNIX ja, unter Windows nein.
Rufus Τ. Firefly schrieb:> Dlls werden dynamisch gelinkt, also genau nicht von ld.
Doch, der Linker muss die Referenzen zur DLL einbauen. Das
zusammenführen des Codes selber macht dann der Loader.
Benny schrieb:> Ich habe keine .a oder .lib-Dateien vorliegen.Rufus Τ. Firefly schrieb:> Du willst vermutlich die erste Variante verwenden, dann musst Du mit den> zu den DLLs gehörenden Importlibraries linken.
Korrekt; wobei mingw32 heutzutage auch ohne Importlibrary (.a)
funktioniert, d.h. alleine mit der DLL.
Benny schrieb:> Muss ich ihm noch mitteilen, dass> es sich um dynamische Bibliotheken handelt?
Nein. Testweise ist es immer gut, einfach den kompletten Pfad zur
Library (ob .so, .a oder .dll) dem gcc/g++ -Aufruf zu übergeben (ohne
-l). Wenn das klappt, hast du nur ein Dateifindungsproblem. Wenn das
auch nicht klappt, ist mit der Library selbst was kaputt.
Peter II schrieb:> es geht nicht one eine lib (.a) datei.
Mit neuerem MinGW32 schon.
Peter II schrieb:> der du musst es im Programmcode> mit LoadLibrary und GetProcAddress machen.
Sehr nervig.
Jörg Wunsch schrieb:> Würde mich wundern, entspricht nicht dem, wie der GNU-Linker sonst> arbeitet (unter Unix).
Es geht ja auch um Windows. Peter II hat insofern Recht, dass Microsofts
Linker immer eine Importbibliothek (.lib) benötigt, welche im Endeffekt
eine einfache statische Library ist, die die Funktionsaufrufe an die DLL
weiterleitet. Aber mit MinGW32 ist das wie gesagt glücklicherweise kein
Problem.
Ich habe unter http://gtk.2g2s.de/ ein Windows-Binary einer
Gtk+3-Version erstellt, dass sich mit pkg-config nutzen lassen sollte.
Es ist aber so, dass das Gtk -Team scheinbar keine Lust mehr auf
Windows-Support (sowie auf mein Gtk-Windows-Paket) hat; es empfiehlt
sich daher die Nutzung von Qt.
Niklas Gürtler schrieb:>> Würde mich wundern, entspricht nicht dem, wie der GNU-Linker sonst>> arbeitet (unter Unix).> Es geht ja auch um Windows.
Die mingw32-Tools gehen ja auch unter Unix. ;-) (Crosscompiler)
Ich glaube mich auch zu erinnern, dass ich damit auch schon gegen
normale DLLs (ohne .a) gelinkt habe, aber völlig sicher bin ich
mir da nicht.
Timmo H. schrieb:> LoadLibrary("blubb.dll")
Das ist aber manuelles Laden zur Laufzeit.
Was Benny will ist, dass die DLL automatisch beim Programmstart
geladen (oder referenziert) wird und dann in der Applikation
benutzt werden kann, als wäre sie statisch gelinkt.