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

how to write makefile mixing C and C++

本文关键字:c++ makefile 何编写 混合      更新时间:2023-10-16

在这个Makefile中,我不知道如何在同一个Makefile中混合c和c++编译出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源文件。

真正需要做的是为"server"目标添加依赖项。例如:

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

可以先编译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

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