You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:32:21