将cpp make文件修改为.c文件不起作用

问题描述:

我试图修改生成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!

你的源变量是:

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

注意文件名lz4hc.cpp。然后你用替换.o,这给你一个文件名lz4hc.opp,这正是你看到的错误。

目前还不清楚您是否真的想要混合使用C和C++文件,或者您是否忘记更改变量中某个文件的名称。

您可以分割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) 

您有在.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