'큰'C 프로젝트를 빌드하는 데 사용하는 makefile 집합이 있습니다. 나는 이제 C++ 프로젝트에서 일부를 재사용하려고 노력 중이며, 알아낼 수없는 두통을 겪었다.Makefile은 % .c에서 작동하지 않습니다. % .cpp
makefile은이
SOURCES = \
elements/blue.cpp
# Dont edit anything below here
VPATH = $(addprefix $(SOURCE_DIR)/, $(dir $(SOURCES)))
CXXFLAGS = $(OPT_FLAGS) -MMD -MF $(BUILD_DIR)/$*.d -D_LINUX -DNDEBUG -pipe
DCXXFLAGS = $(DEBUG_FLAGS) -MMD -MF $(BUILD_DIR)/$*.d -v -D_LINUX -D_DEBUG -pipe
OBJECTS := $(patsubst %.cpp, $(BUILD_DIR)/Release/%.o, $(notdir $(SOURCES)))
DOBJECTS := $(patsubst %.cpp, $(BUILD_DIR)/Debug/%.o, $(notdir $(SOURCES)))
$(OBJECTS): $(BUILD_DIR)/Release/%.o: %.cpp
[email protected][ -d $(dir [email protected]) ] || mkdir -p $(dir [email protected])
$(CPP) $(INCLUDE) $(CXXFLAGS) $(DEFINES) -o [email protected] -c $<
그것처럼 조금 복잡하게 보이지만 그것은 무엇 C에서하는 일은 SOURCES에 정의 된 모든 %의 .c 인 파일을 구축하고 BUILD_DIR에서 오브젝트 파일을 넣어 것입니다. 그것은 C에서 잘 작동하지만, 이것은 cpp 파일에서는 작동하지 않습니다. 내가 얻을
make: *** No rule to make target `blue.cpp', needed by `build/Release/blue.o'. Stop.
그와 같은 VPATH는 전혀 작동하지 않습니다. 시도 :
vpath %.cpp src/elements
하지만 작동하지 않습니다.
놀랍게도 blue.cpp의 이름을 blue.c로 변경하고 makefile을 % .c 사용법으로 다시 편집하면 제대로 컴파일됩니다.
나는 여기에 미친거야?
당신은 이것이 작동하는 C 버전과 작동하는 버전의 유일한 차이점은 .cpp가 전역 적으로 .cpp를 대체한다는 것입니다. –
@ Neil, 기본 C 규칙이 실행되어 파일을 컴파일하는 것처럼 들리지만 명시 적 C++ 규칙은 없습니다. –
@Neil, 네, 작업과 작동하지 않는 유일한 차이점은 % .c와 소스 파일 이름입니다. – Charles