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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.