У меня есть несколько исходных файлов .cpp в той же директории, и я хочу скомпилировать их как объектный файл.
Некоторые из них нуждаются в «дополнительных» библиотеках (одинаковые библиотеки для всех файлов), а некоторые из них нет, я хотел бы написать общие правила для соответствия нужным файлам без написания конкретного правила для каждого файла с дополнительными флаги.
Более подробно я хочу реорганизовать мой Makefile, чтобы мне не приходилось указывать разные правила для исходных файлов SourceFileOpenCVNeeded.cpp OCVAlsoHere.cpp TheSameForMe.cpp (теперь их немного, но их может быть гораздо больше).
Вот как на самом деле выглядит мой make-файл:
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?
Вы могли бы использовать целевые переменные, например (не испытано)
EXTRA_FLAGS=
obj/TheSameForMe.o: EXTRA_FLAGS="$(OCV_PATH) $(OCV_LIBS)"
obj/%.o: src/%.cpp
$(CC) $(CC_FLAGS) $(EXTRA_FLAGS) -c -o $@ $<
Других решений пока нет …