在这个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)

this Howto中有一些非常好的技巧。

09-07 07:36