我在同一目录中有一些源.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中的任何其他改进吗?
答案 0 :(得分:3)
您可以使用target-specific variables,例如(未测试)
EXTRA_FLAGS=
obj/TheSameForMe.o: EXTRA_FLAGS="$(OCV_PATH) $(OCV_LIBS)"
obj/%.o: src/%.cpp
$(CC) $(CC_FLAGS) $(EXTRA_FLAGS) -c -o $@ $<