Eine dynamische Bibliothek erstellen, ist dies der richtige Pfad?

253
Nebbs

Ich versuche zu lernen, wie man statische und dynamische Bibliotheken erstellt, und ich habe ein Problem damit, meinen Lehrer in Bezug auf Bibliotheken zu verstehen. Meine Idee zur Erstellung einer dynamischen Bibliothek ist folgende:

gcc -c main.c -o main.o gcc -c -fPIC func.c -o func.o gcc -shared -Wl,-soname,-libfunc.so.1 -o libfunc.so.1.0.1 func.o ldconfig -n . ln -sf libfunc.so.1.0.1 libfunc.so gcc main.o libfunc.so.1.0.1 -o prog1 export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH 

Nun sagt mein Lehrer, dass die Zeile vor dem letzten so aussehen muss:

gcc main.o -o prog1 -L. -lfunc 

Kann mir jemand den genauen Unterschied erklären? Vielen Dank!

1

1 Antwort auf die Frage

1
grawity

-l<name>ist nur eine Abkürzung, die besagt "Suchen nach lib<name>.sooder lib<name>.ain den konfigurierten Bibliothekspfaden", und -L.fügt einfach das aktuelle Verzeichnis zu diesem Pfad hinzu.

Natürlich -lwird bei der Verwendung von echten Bibliotheken der Vorzug gegeben, da es nicht erforderlich ist, den vollständigen Pfad der Bibliothek oder verschiedene Betriebssystemdetails (wie .sovs .dylibvs .avs .dll) zu kennen, es sollte jedoch kein Unterschied bei der Ausgabe der ausführbaren Datei sein.

$ gcc -o out1 main.c libtest.so $ gcc -o out2 main.c -L. -ltest $ md5sum out* b1b8f46bf6091377b202df90d6bd32cc out1 b1b8f46bf6091377b202df90d6bd32cc out2 

In der ldManualpage finden Sie eine ausführlichere Beschreibung von -lund -L.