2011-12-28 46 views
4

在这个Makefile中,我不知道如何在混合C和C++的相同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) 
+4

为什么不只是像为C++文件一样添加C源文件的变量和规则呢? – 2011-12-28 09:31:32

+0

你的错误是什么? “不工作”的症状是什么? – thiton 2011-12-28 11:10:14

回答

7

G ++可以和将编译两个.C和.cpp源文件就好了。

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

OBJ = net.o hiredis.o sds.o async.o 

... 

all: server 

server: $(OBJ) 

this Howto中有一些真正好的提示。

+0

非常感谢!我曾用CMake来避免这个问题! – Dan 2011-12-29 10:11:45

5

您可以通过首先编译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 

随意改变它,如果你看到一个更合适的方式来做到这一点:)

+0

非常感谢! – Dan 2011-12-29 10:12:26

+0

小记 - 忘记使用CXXFLAGS。 – 2014-09-23 17:24:00

+0

这还会重新编译每个版本上的所有内容。因为没有指定依赖关系。 – RubberDuck 2017-10-13 19:27:31