Предположим, у вас есть makefile
содержащий две цели, как показано ниже:
# targetA
X86CPPTARGET += targetA
targetA,SRCS = FILEA.cpp FILEB.cpp commonFile.cpp
targetA.so,DEPSOL = libUsedByCommon1.cpp
targetA,CPPFLAGS += -Ifakeinclude -std=c++11
# tartargetBgetA
X86CPPTARGET += targetB
targetB,SRCS = FILEC.cpp FILED.cpp commonFile.cpp
targetA.so,DEPSOL = libUsedByCommon2.cpp
targetB,CPPFLAGS += -std=c++11
targetA
а также targetB
поделиться файлом, а именно, commonFile.cpp
который содержит ряд #include
d заголовки.
commonFile.o
создается только один раз GNU make и используется повторно во время компиляции targetB
,
CPPFLAGS присутствует в targetA
заставляет компилятор использовать include, который содержит больше символов, чем тот, который находится в каталоге include по умолчанию. libUsedByCommon2
не экспортирует все дополнительные символы, содержащиеся в заголовке fakeinclude
каталог и во время ссылки, это приводит к undefined reference
,
В настоящее время я использую обходной путь, чтобы создать символическую ссылку на commonFile.cpp
и использовать это в моем makefile
только в одной цели.
# targetA
X86CPPTARGET += targetA
targetA,SRCS = FILEA.cpp FILEB.cpp commonFile.cpp
targetA.so,DEPSOL = libUsedByCommon1.cpp
targetA,CPPFLAGS += -Ifakeinclude -std=c++11
# tartargetBgetA
X86CPPTARGET += targetB
targetB,SRCS = FILEC.cpp FILED.cpp **commonFile_symbolic_link.cpp**
targetA.so,DEPSOL = libUsedByCommon2.cpp
targetB,CPPFLAGS += -std=c++11
Есть ли более чистое решение этой проблемы?
Есть ли способ заставить GNU make перекомпилировать commonFile.cpp
когда используется другой путь включения?
Вы можете создать две новые цели, которые зависят от одного и того же файла C, с разными командами сборки, как в следующем примере …
commonFileA.o: commonFile.cpp
$(CC) -o $@ $^ -FlagsA
commonFileB.o: commonFile.cpp
$(CC) -o $@ $^ -FlagsB
Затем вы можете использовать «commonFileA.o» в качестве зависимости для связи в версии с этими конкретными флагами и т.д …
Возможно, вам следует попытаться скомпилировать один и тот же исходный файл, но с двумя разными выходными объектными файлами:
a0.o: MYFLAGS := foo bar
a0.o: a.c
a1.o: MYFLAGS := baz cux
a1.o: a.c
А затем, для зависимых целей, используйте либо a0.o
или же a1.o
как обязательное условие.
Один из способов сделать это — установить переменную и затем рекурсивно вызвать make
с конкретной целью. Одним из преимуществ этого метода является то, что вы можете указать свои цели только один раз.
Это неполный извлечь, чтобы показать технику:
all: debug release
debug:
@echo -e "\n====== BUILDING DEBUG PROGRAM ======\n"@FLAGS="$(CXXFLAGS_DBG)" SUFFIX="-debug" $(MAKE) general
release:
@echo -e "\n====== BUILDING RELEASE PROGRAM ======\n"@FLAGS="$(CXXFLAGS_REL)" $(MAKE) general
general: $(PROGRAM)$(SUFFIX)
$(PROGRAM)$(SUFFIX): $(SRC)/program.cpp
$(CXX) $(FLAGS) -o $@ $^