将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))))
更容易是只使用'basename':'$(patsubst%,$(OBJ_DIR)/‰, - $(基名$(SOURCES)))' – MadScientist
@MadScientist:这会给你像'lz4hc.cpp.o'这样的名字 - 可能不是你想要的。 –
不,它不会。 'basename'去除后缀,任何后缀。 – MadScientist