Как заставить GNU make перекомпилировать один и тот же объектный файл, используемый в двух целях с разными флагами - PullRequest
0 голосов
/ 10 декабря 2018

Предположим, у вас есть 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, заставляет компилятор использовать включение, которое содержит больше символов, чем то, что находится вкаталог по умолчанию.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 при использовании другого пути включения?

Ответы [ 3 ]

0 голосов
/ 10 декабря 2018

Вероятно, вам следует попытаться скомпилировать один и тот же исходный файл, но с двумя разными выходными объектными файлами:

a0.o: MYFLAGS := foo bar
a0.o: a.c
a1.o: MYFLAGS := baz cux
a1.o: a.c

А затем для зависимых целей используйте либо a0.o, либо a1.o в качестве предварительного условия.

0 голосов
/ 10 декабря 2018

Один из способов сделать это - установить переменную и затем рекурсивно вызвать 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 $@ $^
0 голосов
/ 10 декабря 2018

Вы можете создать две новые цели, которые зависят от одного и того же файла C, с разными командами сборки, как в следующем примере ...

commonFileA.o: commonFile.cpp
    $(CC) -o $@ $^ -FlagsA

commonFileB.o: commonFile.cpp
    $(CC) -o $@ $^ -FlagsB

Затем вы можете использовать "commonFileA.o" в качестве зависимости отссылка в версии с указанными флагами и т. д. *

...