在C++应用Makefile中引入C文件编译失败,求问题排查
Makefile无法编译C++与C混合代码的问题修复
问题根源
- 你写的
$(DIR_OBJ)%.o: %.cpp %.c *.h规则存在逻辑错误:该规则要求每个.o目标必须同时对应.cpp和.c源文件,比如生成obj/main.o需要main.cpp和main.c,但你只有main.cpp,没有对应的main.c,导致Make找不到匹配的规则生成目标文件。 - 未提前创建
obj目录,直接向该目录输出.o文件会失败。 - C语言源文件(
miniaudio.c)未单独处理,用C++编译器编译C代码可能引发不必要的兼容问题。
修正后的Makefile
SRC = main.cpp menu.cpp dialog_wnd.cpp player.cpp C_SRC = miniaudio.c CXX = g++ CC = gcc CXXFLAGS = -Wall $(shell fltk-config --cxxflags) CFLAGS = -Wall LFLAGS = $(shell fltk-config --ldflags) OBJS = $(SRC:.cpp=.o) $(C_SRC:.c=.o) DIR_OBJ = obj/ DIR_OBJS = $(addprefix $(DIR_OBJ), $(OBJS)) # 确保obj目录存在 $(DIR_OBJ): mkdir -p $@ # 编译C++源文件 $(DIR_OBJ)%.o: %.cpp *.h | $(DIR_OBJ) $(CXX) $(CXXFLAGS) -c $< -o $@ # 编译C源文件 $(DIR_OBJ)%.o: %.c | $(DIR_OBJ) $(CC) $(CFLAGS) -c $< -o $@ EXE = myApplication all: $(EXE) $(EXE): $(DIR_OBJS) $(CXX) -o $@ $^ $(LFLAGS) depend: makedepend -- $(CXXFLAGS) -- $(SRC) $(C_SRC) strip: $(EXE) strip --strip-all $(EXE) clean: rm -rf $(DIR_OBJ) rm -f $(EXE)
关键修改点
- 新增
$(DIR_OBJ)目标,用mkdir -p保证编译前目录存在,通过|声明顺序依赖,确保先创建目录再生成目标文件。 - 拆分C和C++编译规则,分别匹配
.cpp和.c后缀,避免交叉依赖导致的规则失效。 - 用
gcc单独编译C源文件,专门设置CFLAGS便于后续添加C语言专属编译参数。 - 调整
clean目标,用rm -rf彻底删除obj目录,避免残留文件干扰。
内容的提问来源于stack exchange,提问作者Duddy67
相关产品推荐
相关产品推荐

