В чем смысл "Предупреждение: привязка общей библиотеки к статической библиотеке не переносима"?

Я делаю одну динамическую библиотеку, используя некоторую функцию библиотеки libmxml.a, но я получаю это предупреждение:

*Warning: Linking the shared library libgstmatroskademux.la against the _
*static library /home/Mr32/gst-template4_final/gst-plugin/src/libmxml.a _
is not portable!

Я также получаю это предупреждение:

gcc: /home/Mr32/gst-template4_final/gst-plugin/src/libmxml.a: linker _
input file unused because linking not done

Так какой смысл этого предупреждения и как я могу его решить?

Изменить:

Существует один уже созданный автогенерируемый файл для компиляции плагина gstreamer. Теперь, чтобы использовать некоторую функцию libmxml.a в этом плагине, я добавил $(PATH)/libmxml.a в переменную GST_CFLAGS в файле make. Теперь, когда я делаю make и make install, плагин отлично работает, но я все еще получаю это предупреждение.

Ответ 1

Связывание разделяемых библиотек с статическими библиотеками невозможно (если вы действительно не очень хорошо знаете, что делаете). Не делайте этого.

Первое предупреждение из libtool. Он сообщает вам, что операция, которую вы просили, будет делать разные вещи в разных системах, и некоторые из этих вещей, вероятно, не то, что вы хотите. Часто он просто терпит неудачу различными эффектами, потому что код, который идет в общих и статических библиотеках, должен быть скомпилирован с различными флагами компилятора.

Второе предупреждение - от gcc. Он говорит вам, что предоставление статической библиотеки при компиляции бессмысленно. Это потому, что у вас $(PATH)/libmxml.a в CFLAGS, где у него нет дела. Фактически, большую часть времени у вас не должно быть $(PATH)/libmxml.a, но -L$(PATH) -lmxml. Это должно продолжаться в LDFLAGS, но gcc не будет жаловаться, если это также приведет к командной строке компилятора.

Ответ 2

Убедитесь, что объектные файлы в libmxml.a были построены с помощью -fPIC. Необходимо создать общую библиотеку. См. Также http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Вот пример:

$ cat stat.c 
int five() { return 5; }
$ gcc -c stat.c -fPIC
$ ar crus libstat.a stat.o
$ cat dynamic.c
int ten() { return five() + five(); }
$ gcc -c dynamic.c -fPIC
$ gcc -shared -o libdyn.so dynamic.o -L. -lstat
$ ldd libdyn.so # Just to show static linkage to libstat.a
  linux-vdso.so.1 =>  (0x00007fffca1b8000)
  libc.so.6 => /lib/libc.so.6 (0x00007fc004649000)
  /lib/ld-linux-x86-64.so.2 (0x00007fc004bf7000)
$ cat main.c 
int main() { return ten(); }
$ gcc main.c -L. -ldyn
$ LD_LIBRARY_PATH=. ./a.out 
$ echo $?
10

Ответ 3

Связывание общей библиотеки libgstmatroskademux.la с статической библиотекой

Это предупреждает вас, что, если вы, например, попытался построить это на 64-битной Linux, он, скорее всего, потерпит неудачу. Это потому, что на x86_64 весь код, который связан с общей библиотекой, должен быть скомпилирован с флагом -fPIC, а код, который живет в библиотеках .a, обычно не является.

gcc:.../libmxml.a: файл файл компоновщика не используется, потому что ссылка не выполнена

Это предупреждает вас, что у вас есть фиктивная командная строка. Скорее всего, вы что-то компилируете и имеете -c в командной строке (которая сообщает GCC прекратить работу после компиляции источника и не выполнять привязку). Поскольку вы также поставляете libmxml.a в той же командной строке, GCC понял, что вы не знаете, что делаете, и предупредил вас об этом (подробнее).