Изменение файла cpp make для файла.c не работает

Я пытаюсь изменить make-файл, который собирает cpp в файл ac, но я сталкиваюсь с некоторой проблемой подстановки строк. Интересно, кто-то может указать на ошибку.

вот кусок файла:

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 $@
    $(AR) cr $@ $^

$(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 $@

.PHONY: all clean

-include $(DEPENDS)

но когда я набрал make clean, я получаю это:

 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

компиляция прекращена.

Я думаю, что проблема с этой строкой, но я не могу понять проблему:

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

Спасибо!

3 ответа

Ваша исходная переменная:

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

Обратите внимание на имя файла lz4hc.cpp, Тогда вы подставляете .c с .o, что дает вам имя файла lz4hc.opp это именно та ошибка, которую вы видите.

Непонятно, действительно ли вам нужно сочетание файлов C и C++ или вы просто забыли изменить имя одного из файлов в переменной.

У вас есть файл, который заканчивается .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))))

Вы можете разделить источники 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 $@
    $(AR) cr $@ $^

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

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

.PHONY: all clean

-include $(DEPENDS)
Другие вопросы по тегам