Как статически связать библиотеку zstd с моей динамической библиотекой? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь статически связать библиотеку zstd (у меня есть libzstd.a или libzstd.so) с моей общей библиотекой libtest.so. Идея состоит в том, что при развертывании libtest.so в нашем приложении нам больше не нужно зависеть от libzstd.a или libzstd.so, поэтому мы должны статически связать библиотеку zstd.

Я пробовал это:

cc  -fPIC -Wl,-soname=libtest.so -static-libgcc  -shared -o libtest.so myobjects.o -ldl -lc -L/path/to/libzstd -l:libzstd.a
cc  -fPIC -Wl,-soname=libtest.so -static-libgcc  -shared -o libtest.so myobjects.o -ldl -lc -Wl,-Bstatic -L/path/to/libzstd -l:libzstd.a
cc  -fPIC -Wl,-soname=libtest.so -static-libgcc  -shared -o libtest.so myobjects.o -ldl -lc /path/to/libzstd/libzstd.a

Но все они дают мне эту ошибку:

/bin/ld: /path/to/libzstd/libzstd.a(zstd_common.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; 
recompile with -fPIC
/path/to/libzstd/libzstd.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make: *** [libtest.so] Error 1

В чем здесь проблема? Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2018

Все объектные файлы, которые связаны с общей библиотекой, должны быть скомпилированы как независимый от позиции код (опция компилятора -fPIC).

Ошибка компоновщика:

/bin/ld: /path/to/libzstd/libzstd.a(zstd_common.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; 
recompile with -fPIC

сообщает вам, что для связи общей библиотеки libtest.so нужен объектный файл zstd_common.o из архив libzstd.a, но этот объектный файл не был скомпилирован с -fPIC.

Итак, вы должны пересобрать libzstd.a из исходного кода, на этот раз при компиляции объекта. файлы, которые он содержит с -fPIC.

...