如何编写混合C和C ++的makefile

在这个Makefile中,我不知道如何在混合C和C ++的同一个Makefile中编译c对象。 如果我首先编译C对象然后运行这个Makefile,它就可以工作。 任何人都可以帮我解决这个问题吗? 提前致谢!

CXX = g++ CXXFLAGS = -Wall -D__STDC_LIMIT_MACROS SERVER_SRC = \ main.cpp SERVER_SRC_OBJS = ${SERVER_SRC:.cpp=.o} REDIS_SRC = \ $(HIREDIS_FOLDER)/net.c \ $(HIREDIS_FOLDER)/hiredis.c \ $(HIREDIS_FOLDER)/sds.c \ $(HIREDIS_FOLDER)/async.c REDIS_SRC_OBJS = ${REDIS_SRC:.c=.o} .SUFFIXES: .SUFFIXES: .o .cpp .cpp.o: $(CXX) $(CXXFLAGS) -I$(HIREDIS_FOLDER) \ -c $< -o $*.o all: server net.o: net.c fmacros.h net.h hiredis.h async.o: async.c async.h hiredis.h sds.h dict.c dict.h hiredis.o: hiredis.c fmacros.h hiredis.h net.h sds.h sds.o: sds.c sds.h server: $(SERVER_SRC_OBJS) $(REDIS_SRC_OBJS) mkdir -p bin $(CXX) $(CXXFLAGS) -o bin/redis_main \ -I$(HIREDIS_FOLDER) \ $(REDIS_SRC_OBJS) \ $(SERVER_SRC_OBJS) \ -lpthread \ -lrt \ -Wl,-rpath,./ .PHONY: clean clean: $(RM) -r bin/redis_main $(RM) ./*.gc?? $(RM) $(SERVER_SRC_OBJS) $(RM) $(REDIS_SRC_OBJS) 

G ++可以并且将编译.c和.cpp源文件就好了。

真正需要做的是为“服务器”目标添加依赖项。 例如:

 OBJ = net.o hiredis.o sds.o async.o ... all: server server: $(OBJ) 

这个Howto中有一些非常好的提示。

您可以通过首先编译C文件然后直接编译CPP文件来实现。 这可能有效(至少在我的一个项目中有效):

 CXX = g++ CC = gcc CFLAGS = -Wall -c CXXFLAGS = -Wall -D__STDC_LIMIT_MACROS OUTPUTDIR = ./bin/ MKDIR = mkdir -p $(OUTPUTDIR) OBJECTC = redis.o CSOURCES = \ $(HIREDIS_FOLDER)/net.c \ $(HIREDIS_FOLDER)/hiredis.c \ $(HIREDIS_FOLDER)/sds.c \ $(HIREDIS_FOLDER)/async.c CXXSOURCES = \ main.cpp all: server server: $(MKDIR) $(CC) $(CSOURCES) $(CFLAGS) -o $(OUTPUTDIR)$(OBJECTC) $(CXX) $(OUTPUTDIR)$(OBJECTC) $(CXXSOURCES) -o $(OUTPUTDIR)server .PHONY: clean clean: $(RM) -rf $(OUTPUTDIR) $(RM) ./*.gc?? $(RM) ./*.o 

如果您看到更合适的方法,请随意更改它:)