GCC 7链接阶段找不到已存在库问题求助
问题描述
尝试编译一个ANSI C程序时,链接阶段报错,系统中已存在所需库,但GCC 7无法找到对应符号。以下是详细信息:
系统信息
uname -a Linux zulu 5.4.0-144-generic #161~18.04.1-Ubuntu SMP Fri Feb 10 15:55:22 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux gcc --version gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ldconfig -p | grep gdal libgdal.so.20 (libc6,x86-64) => /usr/lib/libgdal.so.20 libgdal.so (libc6,x86-64) => /usr/lib/libgdal.so ldconfig -p | grep libblas libblas.so.3 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libblas.so.3 libblas.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libblas.so ldconfig -p | grep libgsl libgslcblas.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgslcblas.so.0 libgslcblas.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgslcblas.so libgsl.so.23 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgsl.so.23 libgsl.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgsl.so
编译错误信息
make tool gcc -std=c99 -I/usr/include/ -I/usr/include/gdal -I/usr/local/include -L/usr/lib/x86_64-linux-gnu -L/usr/lib -L. -lm -lgsl -lblas -lgdal -o tool-geo-pix geo-pix.c alg.o /tmp/ccgCrbdr.o: In function `finalize': geo-pix.c:(.text+0x1b): undefined reference to `GDALClose' /tmp/ccgCrbdr.o: In function `calcWorldToPixel': geo-pix.c:(.text+0x24d): undefined reference to `round' geo-pix.c:(.text+0x26b): undefined reference to `round' /tmp/ccgCrbdr.o: In function `main': geo-pix.c:(.text+0x380): undefined reference to `GDALAllRegister' geo-pix.c:(.text+0x3b5): undefined reference to `GDALOpen' geo-pix.c:(.text+0x3f2): undefined reference to `GDALGetGeoTransform' alg.o: In function `trfm_create': alg.c:(.text+0x177): undefined reference to `gsl_matrix_alloc' alg.c:(.text+0x185): undefined reference to `gsl_vector_alloc' alg.c:(.text+0x193): undefined reference to `gsl_vector_alloc' ... collect2: error: ld returned 1 exit status Makefile:29: recipe for target 'tool' failed make: *** [tool] Error 1
当前Makefile
CC = gcc LPATH = -L/usr/lib/x86_64-linux-gnu -L/usr/lib -L. IPATH = -I/usr/include/ -I/usr/include/gdal -I/usr/local/include CFLAGS = -std=c99 LIBS = -lm -lgsl -lblas -lgdal tool: geo-pix.c alg.o $(CC) $(CFLAGS) $(IPATH) $(LPATH) $(LIBS) -o tool-geo-pix geo-pix.c alg.o alg.o: alg.c $(CC) $(CFLAGS) $(IPATH) $(LPATH) $(LIBS) -c alg.o
原因分析与解决办法
1. 链接库的顺序错误
GCC链接器遵循从左到右的依赖解析规则:处理库时,只会解析当前已出现的目标文件中未定义的符号。如果把库放在源文件/目标文件前面,链接器处理库时还没看到需要这些库的代码,就会忽略库中的符号,后续遇到未定义符号时就会报错。
当前Makefile中$(LIBS)放在了geo-pix.c alg.o之前,这是核心问题,需要把库参数移到所有源文件和目标文件之后。
2. 目标文件编译命令错误
编译alg.o的命令存在两个问题:
-c选项指定只编译不链接,此时不需要添加$(LPATH)和$(LIBS)参数,链接库的操作只在最终链接阶段进行。-c后面应该跟源文件alg.c,而不是目标文件alg.o,原命令会生成错误的文件。
修正后的Makefile
CC = gcc LPATH = -L/usr/lib/x86_64-linux-gnu -L/usr/lib -L. IPATH = -I/usr/include/ -I/usr/include/gdal -I/usr/local/include CFLAGS = -std=c99 LIBS = -lm -lgsl -lblas -lgdal tool: geo-pix.c alg.o $(CC) $(CFLAGS) $(IPATH) $(LPATH) -o tool-geo-pix geo-pix.c alg.o $(LIBS) alg.o: alg.c $(CC) $(CFLAGS) $(IPATH) -c alg.c -o alg.o
额外说明
round函数属于数学库,已经包含在-lm中,修正库顺序后即可解决该符号未定义的问题。- 系统中已通过
ldconfig确认库存在,因此不需要额外调整库路径,修正链接顺序和编译命令即可解决所有报错。
内容的提问来源于stack exchange,提问作者huckfinn
相关产品推荐
相关产品推荐

