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