【发布时间】:2012-02-23 16:36:08
【问题描述】:
我正在编写一个使用 librt 的小型 C 程序。如果我将链接标志放在开头而不是结尾,程序将无法编译,这让我感到非常惊讶:
目前,要编译我所做的程序:
gcc -o prog prog.c -lrt -std=gnu99
如果我要执行以下操作,它将无法在 librt 中找到函数:
gcc -std=gnu99 -lrt -o prog prog.c
然而,这适用于其他库。我在尝试使用简单的 Makefile 时发现了这个问题。 make 实际上编译 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
我现在已经制作了一个将链接放在 gcc 行末尾的 Makefile,但是我很困惑为什么如果链接标志在开头它不起作用。
如果有人可以向我解释这一点,我将不胜感激。谢谢。
【问题讨论】:
-
我对此不是 100%,但我认为链接器可能正在查看 librt 并决定它不需要任何东西,所以就把它扔掉。 librt 是静态库吗?
-
查看这个问题的答案,了解为什么静态链接依赖于顺序:stackoverflow.com/questions/45135/linker-order-gcc
-
可能与默认使用的链接器的 as-needed 选项有关。你可以试试
gcc -std=gnu99 -Wl,-no-as-needed -lrt -o prog prog.c
标签: c++ c linux makefile posix