Почему иногда при использовании GCC флаг компоновщика библиотеки должен стоять в конце?

Я пишу небольшую программу на C который использует librt. Я очень удивлен, что программа не будет компилироваться, если я поставлю флаг ссылки в начале, а не в конце:

В настоящий момент для компиляции программы я выполняю:

gcc -o prog prog. c -lrt -std = gnu99

Если бы я сделал следующее, он не смог бы найти функции в librt:

gcc -std = gnu99 -lrt -o prog prog.c

Тем не менее, это работает с другими библиотеками. Я обнаружил проблему при попытке использовать простой Makefile. сделать действительно скомпилированный prog.c, который сначала не понравился (с использованием флага -c), а затем выполнить связывание.

Это Makefile:

CC = gcc

CFLAGS = -std=gnu99

LIBS= -lrt

LDFLAGS := -lrt


prog: prog.o

        $(CC) -o prog prog.c -lrt -std=gnu99

При вводе make я получу следующий результат:

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

Я создал Makefile, который помещает ссылку в конец строки gcc, однако я не понимаю, почему это не работает, если в начале установлен флаг связывания.

Буду признателен, если кто-нибудь сможет мне это объяснить. Спасибо.

21
задан theprole 23 February 2012 в 16:44
поделиться