2011-12-28 39 views
4

このMakefileでは、CとC++を混在させた同じMakefileでcオブジェクトをコンパイルする方法はわかりません。私が最初にCオブジェクトをコンパイルし、このMakefileを実行すると、それは動作します。誰でも私のためにそれを修正するのに役立つことができますか?前もって感謝します!CとC++を混合してメイクファイルを書く方法

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ソースファイルの変数とルールを追加するだけではないのですか? –

+0

エラーは何ですか? 「働いていない」という症状は何ですか? – thiton

答えて

7

G ++は、両方の.Cをコンパイルしますすることができます.cppソースファイルはうまくいきます。

は本当ににする必要があります。「サーバー」ターゲットの依存関係を追加することです。たとえば:

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

... 

all: server 

server: $(OBJ) 

this Howtoでいくつかの本当に良いヒントがあります。

+0

ありがとう!私はこの問題を避けるためにCMakeを使いました! – Dan

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

+0

小さなメモ - CXXFLAGSの使用を忘れました。 –

+0

これはまた、各ビルドのすべてを再コンパイルします。依存関係が指定されていないためです。 – RubberDuck

関連する問題