Создание общей библиотеки из статической библиотеки с помощью GNU toolchain (gcc/ld)
У меня возникла проблема с созданием общего объекта из статической библиотеки. Хотя я знаю, что есть другие альтернативы, мне сейчас надоело (а не застревать), почему это не работает и как заставить его работать.
Ниже приведен очень простой исходный код, который я использую.
get_zero.c
#include "get_zero.h"
int
get_zero(void)
{
return 0;
}
get_zero.h
int get_zero(void);
main.c
#include <stdio.h>
#include <string.h>
#include "get_zero.h"
int
main(void)
{
return get_zero();
}
Целью является создание двух функционально равных приложений с использованием libget_zero_static и libget_zero_shared.
Вот мои шаги по сборке/компоновке:
gcc -c -fPIC get_zero.c
ar cr libget_zero_static.a get_zero.o
gcc -shared -o libget_zero_shared.so -L. -Wl,--whole-archive -lget_zero_static -Wl,-no--whole-archive
И это ошибка, которую я получаю:
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libc.a(init-first.o): relocation R_X86_64_32 against `_dl_starting_up' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libc.a(init-first.o): could not read symbols: Bad value
collect2: ld returned 1 exit status
Это находится в 64-битной системе Ubuntu.
Я прочитал здесь весь вариант архива, и казалось, что эти вопросы должны были удалить все мои дорожные блоки.
Как создать файл общих объектов из статической библиотеки.
Ответы
Ответ 1
Кажется, вам нужно указать архив как аргумент, а не как библиотеку. Поэтому сделайте libget_zero_static.a
вместо -lget_zero_static
. По крайней мере, это работает для меня следующим образом:
gcc -shared -o libget_zero_shared.so \
-Wl,--whole-archive \
libget_zero_static.a \
-Wl,--no-whole-archive
Ответ 2
Вы можете просто попробовать другой способ: дважды ссылку, один раз для статической библиотеки, а другой для общей библиотеки. Это должно быть проще и чаще.