Einfache Frage: Unterschied .a .la Libs ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
barmeier
Beiträge: 358
Registriert: 12.11.2002 17:33:00
Kontaktdaten:

Einfache Frage: Unterschied .a .la Libs ?

Beitrag von barmeier » 23.07.2006 20:01:02

Hi,

die Frage ist sicher super einfach, aber ich finde bis jetzt keine verständliche Antwort:

.so sind üblicher weise dynamische Libs und werden zu laufzeit nachgeladen.
.a sind statische libs und werden vom linker zum programm gelinked.

Aber was ist .la ??

Ich sehe das öfter, kann mir aber keinen Reim drauf machen :(
wenn ich eine Anweisung beim linken gebe wie -lpng sucht er doch nach libpng.a und nicht
.la oder ?

Ciao
Matze

_mh_
Beiträge: 171
Registriert: 10.07.2006 11:52:28

Beitrag von _mh_ » 23.07.2006 20:25:11

Hallo,

meines wissens sind .la .a Dateien die vom 'libtool' produziert werden und somit eine spezielle form der .a Dateien. Dass .a statisch waere ist mir uebrigens neu, meines Wissens sind nur .a Files nur Dateien die eine Sammlung von object-Dateien (.o) enthalten, welche wiederrum beim uebersetzen ohne Linken mit dem gcc (option -c) entstehen.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 23.07.2006 20:57:40

_mh_ hat geschrieben:Dass .a statisch waere ist mir uebrigens neu, meines Wissens sind nur .a Files nur Dateien die eine Sammlung von object-Dateien (.o) enthalten, welche wiederrum beim uebersetzen ohne Linken mit dem gcc (option -c) entstehen.
eine statische Library ist ja auch nur ein Archiv ( daher .a ) von Objekt Dateien und einem Index der ebenso in dem Archiv gespeichert wird (siehe "ranlib", bzw "ar -s")
barmeier hat geschrieben: .so sind üblicher weise dynamische Libs und werden zu laufzeit nachgeladen.
.a sind statische libs und werden vom linker zum programm gelinked.
.so's können auch (bzw werden meistens auch) zum Programm dazu gelinkt (welche so's zu einem Programm dazugelinkt wurden, kannst du mit dem Befehl: "ldd programmname" anschauen) und werden vom "dynamic loader" (meistens) zum Programmstart geladen.
.so's müssen aber nicht zum Programm dazu gelinkt werden, sondern können auch zur Laufzeit vom Programm selber geladen werden (über dlopen, LoadLibrary...)

.la sind eigentlich "intermediate Dateien" vom Libtool, und sind praktisch das Archiv der .lo Dateien.

Gruß
gms

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 23.07.2006 21:24:00

.la sind Textdateien, schaue sie dir einfach mal an, dann weisst du, warum libtool die braucht

Benutzeravatar
barmeier
Beiträge: 358
Registriert: 12.11.2002 17:33:00
Kontaktdaten:

Beitrag von barmeier » 24.07.2006 12:33:27

na dann bin ich ja froh, das ich nicht der einzige bin, der das nicht wusste :)
na dann kann ich ja lange versuchen das .la file zu linken :(
Was ich nicht ganz verstehe wozu brauche ich denn das .la file überhaupt ?

Das ist doch eher so eine Art Deskriptor oder ?


Ciao
Matze

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 24.07.2006 19:30:07

barmeier hat geschrieben: na dann kann ich ja lange versuchen das .la file zu linken :(
Zum Linken von/mit "libtool libraries" müßtest du schon auch Libtool verwenden :wink:
barmeier hat geschrieben: Was ich nicht ganz verstehe wozu brauche ich denn das .la file überhaupt ?
Wenn diese ".la" Files mit installiert werden, kann Libtool sogar über Paketgrenzen hinweg verwendet werden.
barmeier hat geschrieben: na dann bin ich ja froh, das ich nicht der einzige bin, der das nicht wusste :)
"_mmh_" und ich haben dir DIE Erklärung für die ".la" Dateien aus der Libtool-Anwendersicht geliefert. Aus Anwendersicht betrachtet handelt es sich hier um die "libtool libraries".

Mit folgendem Kommando wird z.B. eine libtool library libhello.la aus libtool objects .lo's erzeugt.
http://www.gnu.org/software/libtool/manual.html#Linking-libraries hat geschrieben: burger$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo \
-rpath /usr/local/lib -lm
Je nach Plattform bzw Konfiguration werden dann bei diesem Kommando auch zusätzliche statische bzw shared libraries erstellt. Das Kommando selber ist aber Plattform unabhängig und auch für statische und shared libraries gleich. Der Entwickler (Anwender) braucht sich daher um dieses Detail nicht mehr zu kümmen.

"Joghurt" hat dir ein Implementierungsdetail von Libtool gezeigt. Dieses ist sicherlich auch sehr interessant und trägt auch zum Verständnis der Arbeitsweise von Libtool bei, für die Arbeit mit Libtool "sollte" diese Information jedoch unerheblich sein.


Gruß
gms

Antworten