2017-06-08 4 views
0

Ich versuche, libass in eine gemeinsam genutzte Bibliothek mit statischer Verknüpfung unter MinGW-w64 zu erstellen. Wenn ich mitBeim Erstellen einer gemeinsam genutzten Bibliothek wurde stattdessen eine statische Bibliothek erstellt.

./configure --disable-static --enable-shared 

konfiguriere, erzeugt es die gemeinsam genutzte Bibliothek (dynamisch verknüpft) wie erwartet. Wenn jedoch I durch statische Verknüpfung zu erzwingen versucht Einstellung

LDFLAGS=-static 

stattdessen eine statisch gelinkte Shared Library of Erzeugen (DLL ohne Abhängigkeit), erzeugt es eine statische Bibliothek (.A).

Ich bin fast sicher, dass ich alle abhängigen statischen Bibliotheken habe und keine Fehler- oder Warnmeldung im make-Prozess angezeigt wird.

Kann jemand bitte etwas Licht auf das, was ich falsch mache, werfen?

Antwort

0

libtool sagt Nein.

Die Lager Autotools Paket ltmain.sh Skript, um die Bindung Flaggen und parsen, wenn es -static findet es nicht eine gemeinsame Bibliothek bauen, nur einen statischen ein.

Welches ist das sinnvollste, weil Sie eine freigegebene Bibliothek nicht statisch verknüpfen können. Eine gemeinsame Bibliothek muss vollständig aus positionsunabhängigem (PIC) Code bestehen oder die Verknüpfung wird fehlschlagen, während eine statische Verknüpfung die Verknüpfung von Nicht-PIC-Objektdateien, die von den Nicht-PIC-Standardbibliotheken und Laufzeitbibliotheken bereitgestellt werden, if nichts anderes.

foo.c

#include <stdio.h> 

void foo(void) 
{ 
    puts("foo"); 
} 

Aufbau eine dynamisch gemeinsam genutzte Bibliothek verknüpft:

$ gcc -c -fPIC foo.c 
$ gcc -shared -o libfoo.so foo.o 
$ file libfoo.so 
libfoo.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), \ 
dynamically linked, BuildID[sha1]=1adff7204d84d138a80bc4b6f3f38211e4b42812, \ 
not stripped 

Versuch, einen statisch gelinkte Shared Library zu bauen:

$ gcc -c -fPIC foo.c 
$ gcc -shared -static -o libfoo.so foo.o 
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/6/crtbeginT.o: \ 
relocation R_X86_64_32 against hidden symbol `__TMC_END__' cannot be used \ 
when making a shared object 
/usr/bin/ld: final link failed: Nonrepresentable section on output 
collect2: error: ld returned 1 exit status 
+0

Ich markiere dies als die richtige Antwort, weil der Grund des Problems in der Tat ist, libtool verbraucht die '-static'-Option, anstatt es zu übergeben. Die Lösung, die ich gefunden habe, besteht darin, "-Wc, -static" in "LDFLAGS" zu setzen, damit libtool im Link-Modus "-static" an gcc weitergibt, um statische Verknüpfungen von Abhängigkeiten zu erzwingen. – yhc

0

Die statische Lib ist nur ein AR-Paket. Sie können den Befehl ar verwenden, um das Paket zu erstellen und es zu entpacken.

+0

Dank für die Beantwortung! Meine Frage ist, dass ich erwarte, dass die Ausgabe eine gemeinsam genutzte Bibliothek (.DLL) ist, aber ich bekomme stattdessen eine statische Bibliothek (.a). – yhc

Verwandte Themen