DLL mit MinGW linken

Gast #3163825
Lesenswert?

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
Persönliche Seite #3163916
Lesenswert?

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
Gast #3163937
Lesenswert?

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?
Gast #3163942
Lesenswert?

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.
Moderator Persönliche Seite #3164007
Lesenswert?

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.
Persönliche Seite #3164031
Lesenswert?

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.
Moderator Persönliche Seite #3164053
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren