Estoy escribiendo un pequeño programa en C que usa librt. Estoy bastante sorprendido de que el programa no compilará si coloco la bandera de enlace al comienzo en lugar de al final:¿Por qué el indicador del vinculador de la biblioteca a veces tiene que ir al final usando GCC?
Por el momento, para compilar el programa que hago:
gcc -o prog prog.c -lrt -std=gnu99
Si tuviera que hacer lo siguiente, no será capaz de encontrar las funciones en librtad:
gcc -std=gnu99 -lrt -o prog prog.c
Sin embargo, esto funciona con otras bibliotecas. Encontré el problema cuando intento usar un simple Makefile. hacer prog.c realmente compilado sin agrado primero (usando el indicador -c) y luego hizo el enlace.
Este es el Makefile:
CC = gcc
CFLAGS = -std=gnu99
LIBS= -lrt
LDFLAGS := -lrt
prog: prog.o
$(CC) -o prog prog.c -lrt -std=gnu99
La salida me gustaría tener al escribir cometer sería:
gcc -std=gnu99 -c -o prog.o prog.c
gcc -lrt prog.o -o prog
prog.o: In function `main':
prog.c:(.text+0xe6): undefined reference to `clock_gettime'
prog.c:(.text+0x2fc): undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
make: *** [buff] Error 1
ahora han elaborado un Makefile que pone el enlace al final de la gcc línea, sin embargo, estoy desconcertado por qué no funciona si la bandera de enlace está en el inicio.
Agradecería que alguien pudiera explicarme esto. Gracias.
No estoy al 100% en esto, pero creo que el enlazador podría estar buscando librt y decidiendo que no necesita nada, así que simplemente deséchelo. ¿Es librt una biblioteca estática? – spencercw
Consulte las respuestas a esta pregunta para obtener una explicación de por qué el enlace estático depende de la orden: http: //stackoverflow.com/questions/45135/linker-order-gcc –
Puede estar relacionado con la opción * del enlazador * según sea necesario. por defecto. Podría intentar 'gcc -std = gnu99 -Wl, -no-as-needed -lrt -o prog prog.c' –