Sto scrivendo un piccolo programma in C che utilizza la libreria. Sono molto sorpreso che il programma non verrà compilato se ho posto la bandiera di collegamento all'inizio invece che alla fine:Perché talvolta il flag del linker della libreria deve essere utilizzato con GCC?
Al momento, per compilare il programma che faccio:
gcc -o prog prog.c -lrt -std=gnu99
Se dovessi fare quanto segue, si riescono a trovare le funzioni in librt:
gcc -std=gnu99 -lrt -o prog prog.c
Eppure, questo funziona con altre biblioteche. Ho trovato il problema quando si tenta di utilizzare un Makefile semplice. fare prog.c compilato in realtà senza piacere prima (usando flag -c) e poi fatto il collegamento.
Questo è il Makefile:
CC = gcc
CFLAGS = -std=gnu99
LIBS= -lrt
LDFLAGS := -lrt
prog: prog.o
$(CC) -o prog prog.c -lrt -std=gnu99
L'uscita avrei ricevuto durante la digitazione di fare sarebbe:
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
mi hanno ormai creato una Makefile che mette il collegamento alla fine del gcc linea, tuttavia sono perplesso perché non funziona se il flag di collegamento è all'inizio.
Gradirei se qualcuno me lo spiegasse. Grazie.
Non sono al 100% su questo, ma penso che il linker potrebbe guardare la libreria e decidere che non ha bisogno di nulla, quindi basta buttarlo via. Librt è una libreria statica? – spencercw
Vedere le risposte a questa domanda per una spiegazione del perché il collegamento statico dipende dall'ordine: http: //stackoverflow.com/questions/45135/linker-order-gcc –
potrebbe essere correlato all'opzione * del necessario * del linker in uso per impostazione predefinita. Si potrebbe provare 'gcc -std = gnu99 -Wl, -no-as-needed -lrt -o prog prog.c' –