GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cuál es el significado de Advertencia:vincular la biblioteca compartida con la biblioteca estática no es portátil?

Asegúrese de que los archivos de objeto en libmxml.a fueron construidos con -fPIC . Es necesario construir una biblioteca compartida. Consulte también http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Aquí hay un ejemplo rápido

$ 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

No es posible vincular bibliotecas compartidas a bibliotecas estáticas (a menos que realmente sepa muy bien lo que está haciendo). No lo hagas.

La primera advertencia es de libtool. Le dice que la operación que solicitó hará diferentes cosas en diferentes sistemas y algunas de esas cosas probablemente no sean lo que desea. A menudo, fallará de varias maneras espectaculares, porque el código que se encuentra en bibliotecas estáticas y compartidas debe compilarse con diferentes indicadores de compilación.

La segunda advertencia es de gcc. Te está diciendo que proporcionar una biblioteca estática al compilar no tiene sentido Eso es porque tienes $(PATH)/libmxml.a en CFLAGS , donde no tiene por qué ser. De hecho, la mayoría de las veces deberías no tener $(PATH)/libmxml.a , pero -L$(PATH) -lmxml en cambio. Eso aún debería ir en LDFLAGS , pero gcc no se quejará si esto también llega a la línea de comandos del compilador.


Vincular la biblioteca compartida libgstmatroskademux.la con la biblioteca estática

Esto le advierte que si, p. intentó construir esto en Linux de 64 bits, probablemente fallaría. Eso es porque en x86_64, todo el código que se vincula a una biblioteca compartida debe ser compilado con -fPIC bandera y código que vive en .a las bibliotecas normalmente no lo son.

gcc:.../libmxml.a:el archivo de entrada del enlazador no se usó porque no se realizó el enlace

Esto le advierte que tiene una línea de comando falsa. Lo más probable es que esté compilando algo y tenga -c en la línea de comando (que le dice a GCC que se detenga después de compilar el código fuente, y no realizar el enlace). Dado que también está proporcionando libmxml.a en esa misma línea de comando, GCC se dio cuenta de que no sabes lo que estás haciendo y te advirtió que lo pensaras (más) al respecto.


Linux
  1. ¿Cuál es el significado de POSIX?

  2. ¿Cuál es la ventaja de __builtin_expect de GCC en declaraciones if else?

  3. ¿Para qué sirve la opción 'soname' para crear bibliotecas compartidas?

  4. Vincular una biblioteca compartida con otra biblioteca compartida en Linux

  5. reubicación R_X86_64_32S contra error de enlace

¿Cuáles son las desventajas de las colas de mensajes de Linux?

¿Diferencia entre objetos compartidos (.so), bibliotecas estáticas (.a) y DLL (.so)?

¿Cuál es el significado de fork() y grep en Linux?

¿Cuál es el significado de un signo de dólar doble en bash/Makefile?

¿Cuál es el significado de 1 al final del script awk?

¿Cuál es el significado de curl -k -i -X ​​en Linux?