c – 如何强制GNU make重新编译具有不同FLAGS的两个目标中使用的相同目标文件
作者:互联网
假设您有一个包含两个目标的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,它包含许多#included标头.
commonFile.o只由GNU make创建一次,并在编译targetB时重用.
targetA中存在的CPPFLAGS使编译器使用包含更多符号的包含,该符号位于默认包含目录中. libUsedByCommon2不会导出fakeinclude目录中的标头中包含的所有其他符号,并且在链接时,这会导致未定义的引用.
我现在使用的解决方法是创建一个指向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”作为依赖项,在版本中链接那些特定的标志等…
标签:c-3,clearcase,c,makefile,ld 来源: https://codeday.me/bug/20190727/1549031.html