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
相关产品推荐
相关产品推荐

