Сборка общей библиотеки создала статическую библиотеку
Я пытаюсь встроить libass в общую библиотеку со статическим связыванием под MinGW-w64. Когда я настраиваю с
./configure --disable-static --enable-shared
он генерирует разделяемую библиотеку (динамически связанную), как и ожидалось. Тем не менее, когда я пытаюсь принудительно установить статическое связывание, установив
LDFLAGS=-static
вместо создания статически связанной общей библиотеки (.dll без зависимости) она создает статическую библиотеку (.a).
Я почти уверен, что у меня есть все зависимые статические библиотеки, и в процессе make не отображается сообщение об ошибке или предупреждение.
Кто-нибудь может пролить свет на то, что я делаю неправильно?
2 ответа
libtool
говорит нет
Пакет автоинструментов со склада ltmain.sh
скрипт анализирует флаги связывания и, если найдет -static
он не будет создавать общую библиотеку, только статическую.
Это самое разумное, потому что вы не можете статически связать разделяемую библиотеку. Общая библиотека должна полностью состоять из кода, независимого от положения (PIC), иначе связь не будет выполнена, тогда как статическая связь будет требовать связывания объектных файлов не-PIC, предоставляемых стандартными библиотеками не-PIC и библиотеками времени выполнения, если ничего больше.
foo.c
#include <stdio.h>
void foo(void)
{
puts("foo");
}
Создайте динамически связанную разделяемую библиотеку:
$ 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
Попытайтесь создать статически связанную разделяемую библиотеку:
$ 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
Статическая библиотека - это просто пакет ar. Вы можете использовать команду ar, чтобы сделать пакет и распаковать его.