我正在编写一个使用 librt 的小型 C 程序。让我感到非常惊讶的是,如果我将链接标志放在开头而不是结尾,程序将无法编译:
目前,为了编译程序,我这样做:
gcc -o prog prog.c -lrt -std=gnu99
如果我执行以下操作,将无法找到 librt 中的函数:
gcc -std=gnu99 -lrt -o prog prog.c
然而,这适用于其他库。我在尝试使用简单的 Makefile 时发现了这个问题。 make 实际上不喜欢先编译 prog.c (使用 -c 标志),然后进行链接。
这是生成文件:
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 行的末尾,但是我很困惑为什么如果链接标志位于开头则它不起作用。
如果有人能向我解释这一点,我将不胜感激。谢谢。
当链接器处理每个模块(无论是库还是目标文件)时,它会尝试解析每个未定义的符号,同时可能会添加到其未定义符号列表中。当到达模块列表的末尾时,它要么已解析所有未定义的符号并成功,要么报告未定义的符号。
就您而言,当它处理 librt 时,它没有未定义的符号。处理 proc 导致clock_gettime 成为未定义的符号。 gcc 不会返回并在 librt 中查找未定义的符号。
因此,您应该始终首先拥有代码,然后是库,最后是平台提供的库。
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)