Makefile混合编译C和C++文件出现undefined reference报错如何解决
问题原因
- 核心错误是你的Makefile中
CXXFLAGS缺少-c编译选项:
你在C语言编译参数CFLAGS中明确加了-c,作用是仅执行编译流程、不触发链接,生成后缀为.o的目标文件。但C编译参数CXXFLAGS没有加-c,导致编译main.cpp时g直接执行了编译+链接全流程,此时还没有编译linked_list.c生成对应的目标文件,自然找不到所有C语言实现的链表函数定义,报未定义引用错误。 - 次要问题:你把
GDB_OPT的定义写在了CFLAGS、CXXFLAGS引用它的位置之后,会导致编译参数中的-g不生效,无法生成调试符号。
修复方案
- 修改Makefile中的
CXXFLAGS配置,补充-c参数:
# 修改前 CXXFLAGS += $(GDB_OPT) -Wall # 修改后 CXXFLAGS += $(GDB_OPT) -Wall -c
- 调整
GDB_OPT定义的位置,放到CFLAGS和CXXFLAGS声明之前,确保调试参数生效:
# 调整后顺序 GDB_OPT := -g CC := gcc C99 := -std=c99 CFLAGS += $(GDB_OPT) -Wall -c CXX := g++ CXX11 := -std=c++11 CXXFLAGS += $(GDB_OPT) -Wall -c
- 执行
make clean清理旧的构建产物后重新执行make即可正常构建。
内容的提问来源于stack exchange,提问作者GOD SERENA
相关产品推荐
相关产品推荐

