2012-11-05 34 views
1

我在同一目錄中有一些源.cpp文件,我想將它們編譯爲目標文件。 其中一些需要「額外」庫(所有文件的相同庫),並且其中一些庫不需要,我想編寫一般規則來匹配正確的文件,而不用爲每個文件編寫特定的規則額外的標誌。 更多詳細信息我想重構我的Makefile,以便我不必爲源文件SourceFileOpenCVNeeded.cpp OCVAlsoHere.cpp TheSameForMe.cpp指定不同的規則(現在它們很少,但它們可能更多)。爲具有不同標誌的對象文件重構Makefile

這裏是我的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:可以添加到我的Makefile的任何其他方面的改進?

+0

你真的需要不同的標誌嗎? 'pkg-config --cflags'通常只提供-I選項來指定在哪裏查找頭文件,如果你不使用這些頭文件,那沒關係。 –

+0

你可以使obj規則爲通用的:'obj /%o:src /%。cpp' –

+1

你不需要在編譯階段鏈接庫和目標文件(很確定它們只會被忽略,當給出'-c'時)。只有在鏈接最終可執行文件時才需要指定這些庫。 – twalberg

回答

相關問題