2015-04-18 84 views
1

我試圖修改生成cpp到c文件的makefile,但我遇到了一些字符串替換問題。我想知道是否有人能指出這個錯誤。將cpp make文件修改爲.c文件不起作用

這裏是一片文件:

SOURCES := \ 
lz4.c \ 
lz4frame.c \ 
lz4hc.cpp \ 
xxhash.c 

OBJECTS := $(addprefix $(OBJ_DIR)/,$(subst .c,.o,$(SOURCES))) 
DEPENDS := $(addprefix $(OBJ_DIR)/,$(subst .c,.d,$(SOURCES))) 

all: $(OUT_DIR)/$(LIB_NAME) 

clean: 

rm -rf $(OBJ_DIR) 
rm -rf $(OUT_DIR) 

$(OUT_DIR)/$(LIB_NAME): $(OBJECTS) 
    @rm -f [email protected] 
    $(AR) cr [email protected] $^ 

$(OBJECTS): $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c 
    @mkdir -p $(@D) 
    $(CXX) -MMD -MF $(OBJ_DIR)/$*.d -MP -MT'$(OBJ_DIR)/$*.o $(OBJ_DIR)/$*.d' -c $(CPPFLAGS) $(CXXFLAGS) $< -o [email protected] 

.PHONY: all clean 

-include $(DEPENDS) 

,但是當我輸入使清潔我得到這個:

Makefile:38: target `Release64/obj/lz4hc.opp' doesn't match the target pattern 

,或者當我嘗試建立我得到這個:

g++-4.6 -MMD -MF ./Release64/obj/Release64/obj/lz4hc.opp.d -MP -MT'./Release64/obj/Release64/obj/lz4hc.opp.o ./Release64/obj/Release64/obj/lz4hc.opp.d' -c -I../../../include -I../../../thirdparty/include/lz4 -std=c++0x -fPIC -O2 -m64 -o Release64/obj/lz4hc.opp 
g++-4.6: fatal error: no input files 

編譯終止。

我認爲這個問題是這一行,但我想不通的問題:

​​

THX!

回答

2

你的源變量是:

SOURCES := \ 
lz4.c \ 
lz4frame.c \ 
lz4hc.cpp \ 
xxhash.c 

注意文件名lz4hc.cpp。然後你用替換.o,這給你一個文件名lz4hc.opp,這正是你看到的錯誤。

目前還不清楚您是否真的想要混合使用C和C++文件,或者您是否忘記更改變量中某個文件的名稱。

0

您可以分割C和C++源代碼爲單獨的列表,並使用模式規則來構建你的源代碼,如:

SOURCES_C := \ 
lz4.c \ 
lz4frame.c \ 
xxhash.c 
SOURCES_CPP:= lz4hc.cpp 
SOURCES:=$(SOURCES_C) $(SOURCES_CPP) 

OBJECTS_C := $(addprefix $(OBJ_DIR)/,$(subst .c,.o,$(SOURCES_C))) 
OBJECTS_CPP:=$(addprefix $(OBJ_DIR)/,$(subst .cpp,.o,$(SOURCES_CPP))) 
OBJECTS:=$(OBJECTS_C) $(OBJECTS_CPP) 

DEPENDS_C := $(addprefix $(OBJ_DIR)/,$(subst .c,.d,$(SOURCES_C))) 
DEPENDS_CPP := $(addprefix $(OBJ_DIR)/,$(subst .cpp,.d,$(SOURCES_CPP))) 
DEPENTS:=$(DEPENDS_C) $(DEPENDS_CPP) 

all: $(OUT_DIR)/$(LIB_NAME) 

clean: 
    $(RM) $(OBJECTS) $(DEPENDS) 

$(OUT_DIR)/$(LIB_NAME): $(OBJECTS) 
    @rm -f [email protected] 
    $(AR) cr [email protected] $^ 

%.o: %.c 
    @mkdir -p $(@D) 
    $(CC) -MMD -MF $(OBJ_DIR)/$*.d -MP -MT'$(OBJ_DIR)/$*.o $(OBJ_DIR)/$*.d' -c $(CPPFLAGS) $(CXXFLAGS) $< -o [email protected] 

%.o: %.cpp 
    @mkdir -p $(@D) 
    $(CXX) -MMD -MF $(OBJ_DIR)/$*.d -MP -MT'$(OBJ_DIR)/$*.o $(OBJ_DIR)/$*.d' -c $(CPPFLAGS) $(CXXFLAGS) $< -o [email protected] 

.PHONY: all clean 

-include $(DEPENDS) 
0

您有在.cpp結尾的文件,但你的subst命令只處理名稱那在.c結束。嘗試:

OBJECTS := $(addprefix $(OBJ_DIR)/,$(subst .c,.o,$(subst .cpp,.o,$(SOURCES)))) 
DEPENDS := $(addprefix $(OBJ_DIR)/,S(subst .c,.d,$(subst .cpp,.d,$(SOURCES)))) 
+0

更容易是隻使用'basename':'$(patsubst%,$(OBJ_DIR)/‰, - $(基名$(SOURCES)))' – MadScientist

+0

@MadScientist:這會給你像'lz4hc.cpp.o'這樣的名字 - 可能不是你想要的。 –

+0

不,它不會。 'basename'去除後綴,任何後綴。 – MadScientist