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

Ubuntu下基于glib开发时Makefile编译报glib函数未定义引用错误求助

问题原因与解决方案

你的Makefile存在两处核心错误,导致链接阶段无法找到glib/qmi相关符号:

  • 生成.o目标文件的阶段不需要传入链接库参数。你在编译qmi_test.o的规则里加入了${PKGCONFIGLIBS}属于多余操作,且编译目标文件时只需要执行编译步骤,应该加-c参数告诉gcc只编译不链接,否则这里gcc会尝试直接生成可执行文件而非目标文件,导致后续链接出错。
  • 最终生成./bin/main的链接步骤完全没有加入依赖库${PKGCONFIGLIBS},链接器无法解析glib、qmi相关的函数符号,所以抛出undefined reference错误。

修正后的Makefile示例

INCLUDES= -I ./headers
FLAGS= -g

# 合并pkg-config调用,写法更简洁,效果和分开调用完全一致
PKGCONFIGCFLAGS= `pkg-config --cflags qmi-glib gio-2.0 gobject-2.0 glib-2.0 gmodule-2.0`
PKGCONFIGLIBS= `pkg-config --libs qmi-glib gio-2.0 gobject-2.0 glib-2.0 gmodule-2.0` -lm

CC=gcc

OBJECTS=./build/qmi_test.o

all: ${OBJECTS}
  # 链接阶段把库放在参数最后,符合gcc参数顺序要求
  $(CC) ${FLAGS} ${INCLUDES} ./sources/main.c ${OBJECTS} ${PKGCONFIGLIBS} -o ./bin/main

./build/qmi_test.o:./sources/qmi_test.c
  # 编译目标文件加-c参数,只编译不链接,不需要传入库参数
  $(CC) ${FLAGS} ${INCLUDES} ${PKGCONFIGCFLAGS} -c ./sources/qmi_test.c -o ./build/qmi_test.o

注意事项

  • Makefile里的规则缩进必须用制表符(Tab),不能用空格,否则会触发make规则报错。
  • 库参数必须放在gcc命令的最后部分,放在待编译/链接的源文件、目标文件之后,链接器才能正确解析符号依赖。

内容的提问来源于stack exchange,提问作者ad_valle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:15:00