как написать make-файл, смешивающий C и C ++ - PullRequest
5 голосов
/ 28 декабря 2011

В этом Makefile я не знаю, как компилировать объекты c в одном Makefile, смешивая 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)

Ответы [ 2 ]

8 голосов
/ 29 декабря 2011

G ++ может и будет прекрасно компилировать исходные файлы .c и .cpp.

Что вам действительно нужно , так это добавить зависимости для «серверной» цели. Например:

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

...

all: server

server: $(OBJ)

Есть несколько действительно хороших советов в этом Howto .

6 голосов
/ 29 декабря 2011

Вы можете сделать это, скомпилировав сначала файлы 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

Не стесняйтесь менять его, если вы видите более правильный способ сделать это:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...