2017-06-08 1 views
0

J'essaye de construire libass dans une bibliothèque partagée avec la liaison statique sous MinGW-w64. Lorsque je configure avecLa construction d'une bibliothèque partagée a créé une bibliothèque statique à la place

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

génère la bibliothèque partagée (liée dynamiquement) comme prévu. Cependant, lorsque je tente de forcer la liaison statique en définissant

LDFLAGS=-static 

au lieu de générer une bibliothèque partagée lié statiquement (dll sans charge), il génère une bibliothèque statique (.a).

Je suis presque certain d'avoir toutes les bibliothèques statiques dépendantes et aucun message d'erreur ou d'avertissement n'est affiché dans le processus de création. Quelqu'un peut-il s'il vous plaît faire la lumière sur ce que je fais mal?

Répondre

0

libtool dit n °

autotools stock de Le paquet ltmain.sh les drapeaux scénario parse de liaison et si elle trouve -static il ne sera pas construire une bibliothèque partagée, juste un statique.

Ce qui est le plus raisonnablement possible, car vous ne pouvez pas lier statiquement une bibliothèque partagée. Une bibliothèque partagée doit être composée entièrement de code indépendant de la position (PIC) ou la liaison échouera, alors qu'une liaison statique appellera la liaison des fichiers objets non-PIC, contribués par les bibliothèques standard et non-PIC, si rien d'autre.

foo.c

#include <stdio.h> 

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

construire une bibliothèque partagée liée dynamiquement:

$ 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 

tentative de construire une bibliothèque liée statiquement partagée:

$ 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

Je marque cela comme la bonne réponse car la racine du problème est en effet libtool consommant l'option '-static' au lieu de la transmettre. La solution que j'ai trouvée est de passer '-Wc, -static' dans' LDFLAGS' à la place afin que libtool transmette '-static' à gcc en mode lien pour forcer la liaison statique des dépendances. – yhc

0

La bibliothèque statique est juste un paquet ar. Vous pouvez utiliser la commande ar pour créer le pack et le décompresser.

+0

Merci d'avoir répondu! Ma question est que je m'attends à ce que la sortie soit une bibliothèque partagée (.DLL) mais je reçois une bibliothèque statique (.a) à la place. – yhc