[英]how to write makefile mixing C and 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)
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
如果您看到更合适的方式,请随意更改它:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.