使用给定Makefile运行单元测试时遇ld: cannot find -lt错误求助
问题描述
我正在为一个课程项目使用给定的Makefile运行单元测试,但遇到了无法解决的错误。以下是Makefile中相关部分:
CC=gcc SDL=/usr/include/SDL2 CFLAGS_D=-g -Wall -Wextra -pedantic -O0 -D_REENTRANT -D_DEBUG -DSTRICT_THREADING -I$(SDL) CFLAGS=-Wall -Wextra -O2 -D_REENTRANT -I$(SDL) LD=gcc LDFLAGS=-lm -lrt -L$(SDL) -lSDL2 -lSDL2_ttf -lSDL2_gfx -ldl -lpthread LDFLAGS_D= $(LDFLAGS) #-lmcheck LDFLAGS_T=-lm -lrt -L. -lt OBJECTS= \ point.o graphe.o \ parse_util.o graphe_parse.o \ liste_noeud.o dijkstra.o \ viewport.o \ graphrep.o window.o app.o OBJECTS_D= $(subst .o,.do,$(OBJECTS)) VALGRIND=valgrind --leak-check=full -s runtest_liste_noeud: test_liste_noeud @echo "================= [Test de liste_noeud] =================" ./test_liste_noeud test_liste_noeud.o: test_liste_noeud.c $(CC) $(CFLAGS_D) -c $< -o $@ test_liste_noeud: test_liste_noeud.o graphe.do point.do liste_noeud.do $(LD) $^ -o $@ $(LDFLAGS_T) %.o: %.c %.h $(CC) $(CFLAGS) -c $< -o $@ %.do: %.c %.h $(CC) $(CFLAGS_D) -c $< -o $@
执行make test_liste_noeud时出现错误:
gcc test_liste_noeud.o graphe.do point.do liste_noeud.do -o test_liste_noeud -lm -lrt -L. -lt /usr/bin/ld: cannot find -lt: No such file or directory collect2: error: ld returned 1 exit status make: *** [Makefile:97: test_liste_noeud] Error 1
我尝试在/usr/bin/ld中查找-lt但未找到,也在学校电脑上试过,依然报错。
修复方法
错误核心是链接器找不到-lt对应的库文件:-l参数后的t是库名,链接器会自动寻找libt.a(静态库)或libt.so(动态库)文件,解决思路如下:
- 检查当前目录的测试库:
LDFLAGS_T指定了-L.(优先搜索当前目录),先确认当前目录下是否存在libt.a或libt.so,如果没有说明测试依赖的库未编译生成。 - 补充库的编译规则:如果Makefile里没有生成
libt.a/libt.so的规则,需要添加对应步骤。比如测试库源码是t.c,可以补充:libt.a: t.o ar rcs $@ $^ - 修正库名笔误:如果
-lt是写错的,比如实际应该用单元测试库libtap.a(对应-ltap),直接修改LDFLAGS_T中的库参数即可。 - 确认项目配套文件:如果是课程提供的Makefile,可能遗漏了配套的测试库文件,联系同学或助教确认是否需要额外下载或编译对应库。
内容的提问来源于stack exchange,提问作者Nell Truong
相关产品推荐
相关产品推荐

