1

同じディレクトリにいくつかのソース.cppファイルがあり、それらをオブジェクトファイルとしてコンパイルしたいと思います。それらのいくつかはリンクするために「余分な」ライブラリ(すべてのファイルに同じライブラリ)を必要とします、そしてそれらのいくつかはリンクしません、私は余分なファイルごとに特定のルールを書かずに、正しいファイルに一致する一般的なルールを書きたいですフラグ。より詳細には、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 $@ $<

obj/OCVAlsoHere.o: src/OCVAlsoHere.cpp 
    $(CC) $(OCV_PATH) $(CC_FLAGS) $(OCV_LIBS) -c -o $@ $<

obj/TheSameForMe.o: src/TheSameForMe.cpp 
    $(CC) $(OCV_PATH) $(CC_FLAGS) $(OCV_LIBS) -c -o $@ $<

obj/%.o: src/%.cpp
    $(CC) $(CC_FLAGS) -c -o $@ $<

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

PS:Makefileに追加できる他の改善点はありますか?

4

1 に答える 1

3

たとえば、ターゲット固有の変数を使用できる場合があります(テストされていません)

EXTRA_FLAGS=
obj/TheSameForMe.o: EXTRA_FLAGS="$(OCV_PATH) $(OCV_LIBS)"

obj/%.o: src/%.cpp
  $(CC) $(CC_FLAGS) $(EXTRA_FLAGS) -c -o $@ $<
于 2012-11-05T15:50:18.583 に答える