2010-01-25 5 views
0

'큰'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 사용법으로 다시 편집하면 제대로 컴파일됩니다.

나는 여기에 미친거야?

+0

당신은 이것이 작동하는 C 버전과 작동하는 버전의 유일한 차이점은 .cpp가 전역 적으로 .cpp를 대체한다는 것입니다. –

+0

@ Neil, 기본 C 규칙이 실행되어 파일을 컴파일하는 것처럼 들리지만 명시 적 C++ 규칙은 없습니다. –

+0

@Neil, 네, 작업과 작동하지 않는 유일한 차이점은 % .c와 소스 파일 이름입니다. – Charles

답변

0

나는 여기에서 그것을 알아 냈다. 그리고 그것의 큰 난장판을 알았다.

몇 가지 실험을 한 후 make-bugs 목록에 버그를 게시하고 디버그 출력을 켜서 정확히 무슨 일이 진행되었는지 알려줍니다. 내가 해결책을 찾도록 이끌었기 때문에 나는 이것을해야만했다.

http://mad-scientist.net/make/autodep.html에서 개발 된 자동 종속성 생성 체계를 사용하고 놀랍게도 충분히 만들어 냈습니다. 이

$(OBJECTS): $(BUILD_DIR)/Release/%.o: %.cpp 
를 해결하려고 할 때 문제가

-include $(patsubst %.c, $(BUILD_DIR)/%.d, $(notdir $(SOURCES))) 

내가 %의 .CPP 해당를 변경하지 않은이 라인에 발생하고 blue.cpp을 포함하려고 몇 가지 이유가 VPATH를 사용하여 검색하지 수 있도록 발생

그래서 해결책은 makefile을 올바르게 포트하는 것입니다.

3

예를 들어, C++ 파일을 컴파일하기 위해 활성화 된 Makefile 규칙이없는 것처럼 보입니다. %이 제대로 확장되지 않았습니까?

$(OBJECTS): %.o: %.cpp 
    ... 

을 시도하고 적절한 $(basename ..)를 사용하여 규칙 부분에서 대상을 지정합니다.

C가 컴파일을 위해 built-in default rule이기 때문에이 파일은 blue.c에 대해 C에서 작동합니다. --no-builtin-rules 옵션으로 Make를 실행하면 blue.c 파일도 작동하지 않을 것입니다. n.o 양식 $(CC) -c $(CPPFLAGS) $(CFLAGS)'. Compiling C++ programs n.o is made automatically from n.cc, n.cpp, or n.C with a command of the form $ (CXX) -c $의 명령 (CPPFLAGS) $ (CXXFLAGS) '로 n.c에서 자동으로 만들어 C 프로그램을 컴파일 워드 프로세서

,

. 접미사 .cc' for C++ source files instead of .C '를 사용하는 것이 좋습니다. 이

는 기본 C++ 규칙이지만, 때문에 다른 규칙이나 나쁜 변수의 당신의 발로되지 않을 수 있습니다. 확실하게 규칙을 명시 적으로 작성하는 것이 좋습니다. 다음은이 소스에서 오브젝트 파일을 컴파일

%.o: %.cpp 
    $(CPP) $(CPP_OPTS) -c -o [email protected] $< 

:

당신은 같은 규칙을 필요

executable: $(OBJECTS) 
    ... compile objects into final blob ... 

어디에서 어떤 형식 %.o 트리거 종속성의 대상. 또는 Autotools/Autoconf을 사용하여 Makefile을 빌드하십시오.여기에 그냥 객체의 디렉토리에 C++ 파일을 빌드를 쓴 예는 다음과 같습니다 수단을 통해

SOURCES=$(wildcard path/to/src/*.cpp) 
OBJECTS=$(SOURCES: .cpp=.o) 
CC=g++ 

final: $(OBJECTS) 
    mv $(OBJECTS) /path/to/build_dir 

%.o: %.cpp: 
    g++ -c -o [email protected] $< 

하지 완전한 예,하지만 당신은 아이디어를 얻을. final 규칙에서 개체 파일을 복사하지만 여기에있는 작업을 모두 수행하거나 -o 옵션을 변경하여 특정 위치에 파일을 빌드 할 수 있습니다.

+0

about : $ (OBJECTS) : $ (BUILD_DIR)/Release/% .o : % .cpp –

+0

참고 C++ 빌드 규칙 $ (OBJECTS) : $ (BUILD_DIR)/Release/%를 정의합니다. : 거기에 % .cpp 줄을 골라 내기 힘든 종류의 – Charles

+0

그 규칙은 활성화되지 않습니다. 먼저 간단한 형식으로 분해하십시오. '% '확장이 잘못되었다고 생각합니다. –

3

VPATH가 정말로 필요합니까 - 과거에는 문제가 없었습니다. 사실 VPATH가 확장에 의존한다는 것을 기억하는 것 같습니다. 그래서 에이든의 이론에 부합 할 것입니다. 내 makefile에서 명시 적으로 소스 디렉토리 SDIR을 제공합니다 :

.

편집 : VPATH를 사용하는 경우 vpath 지시문의 사용을 조사해야합니다 (대소 문자 구분). 예 :

vpath %.cpp foo:bar 

은 foo 및 bar 디렉토리에서 .cpp fies를 찾습니다. 하지만 내가 말했듯이, 나는 이것을 사용하는 데 어려움을 겪었습니다.

+0

이것이 확인되면. 나는 내 와플을 삭제할 것이다;), 또한 일반적으로 좋은 조언을 위해 +1한다. –

+0

매우 귀찮은 작은 변수를 말한 것처럼, 나는 그것을 사용할 필요가 없었 으면 좋겠다. 문제는 내 원본 폴더가 평평하지 않다는 것이며, 내 bin 폴더가 src 디렉토리에있는 것과 동일한 디렉토리 트리 구조로 끝날 수 없습니다. 이렇게 vpath를 사용하는 것이 내 솔루션이었습니다. 제대로 된 것은 몇 주가 걸렸습니다. 제가 말하는 것이 더 나은 방법입니다. 나는 vpath를 사용하지 않고 어떤 일이 일어나는지 보도록 설정할 것이다. – Charles

+0

vpath를 사용하지 않으면 완벽하게 작동합니다. eugggg vpaths, 이제 빌드 경로 문제에 대한 새로운 솔루션이 필요합니다. – Charles

관련 문제