2012-11-05 3 views
1

소스 .cpp 파일이 같은 디렉토리에 있고 오브젝트 파일로 컴파일하려고합니다. 그들 중 일부는 "여분의"라이브러리 (모든 파일에 대해 동일한 libs)가 링크되어야하고 그 중 일부는 필요하지 않습니다. 각 파일에 대한 특정 규칙을 작성하지 않고 올바른 파일과 일치시키는 일반 규칙을 작성하고 싶습니다. 추가 플래그. 자세히 자세히 소스 파일에 대해 다른 규칙을 지정할 필요가 없도록 Makefile을 리팩토링하고 싶습니다. SourceFileOpenCVNeeded.cpp OCVAlsoHere.cpp TheSameForMe.cpp (현재는 거의 없지만 훨씬 더 많을 수 있습니다).다른 플래그가있는 오브젝트 파일의 Makefile 리팩토링

CPP_FILES := $(wildcard src/*.cpp) 
OBJ_FILES := $(addprefix obj/,$(notdir $(CPP_FILES:.cpp=.o))) 
MAIN_SRC := main.cpp 
OCV_LIBS := `pkg-config opencv --libs` 
OCV_PATH := `pkg-config opencv --cflags` 
MY_LIB := launcher 
LD_FLAGS := $(MAIN_SRC) -L. -l$(MY_LIB) $(OCV_LIBS) 
CC_FLAGS := -c -fPIC 
AR_FLAGS := rcs 
STATIC_LIB := lib$(MY_LIB).a 
CC := g++ 
EXEC := test 

all: lib main 

main: 
    $(CC) $(LD_FLAGS) -o $(EXEC) 

lib: $(OBJ_FILES) 
    ar $(AR_FLAGS) $(STATIC_LIB) $^ 

obj/SourceFileOpenCVNeeded.o: src/SourceFileOpenCVNeeded.cpp 
    $(CC) $(OCV_PATH) $(CC_FLAGS) $(OCV_LIBS) -c -o [email protected] $< 

obj/OCVAlsoHere.o: src/OCVAlsoHere.cpp 
    $(CC) $(OCV_PATH) $(CC_FLAGS) $(OCV_LIBS) -c -o [email protected] $< 

obj/TheSameForMe.o: src/TheSameForMe.cpp 
    $(CC) $(OCV_PATH) $(CC_FLAGS) $(OCV_LIBS) -c -o [email protected] $< 

obj/%.o: src/%.cpp 
    $(CC) $(CC_FLAGS) -c -o [email protected] $< 

clean: 
    rm -f $(OBJ_FILES) $(STATIC_LIB) $(EXEC) 

PS : 여기

내 메이크 파일이 실제로 어떻게 생겼는지 내 메이크 파일에 추가 할 수있는 다른 개선?

+0

정말 다른 플래그가 필요합니까? 'pkg-config --cflags'는 일반적으로 헤더 파일을 찾을 위치를 지정하는 -I 옵션을 제공하며,이 헤더를 사용하지 않으면 괜찮습니다. –

+0

obj 규칙을 일반화 할 수 있습니다 :'obj/% .o : src/%. cpp' –

+1

컴파일 단계에서 오브젝트 파일과 라이브러리를 링크 할 필요는 없습니다 (어쨌든, '-c'가 주어 졌을 때). 최종 실행 파일을 링크 할 때 라이브러리를 지정해야합니다. – twalberg

답변

관련 문제