其他分享
首页 > 其他分享> > c – 如何强制GNU make重新编译具有不同FLAGS的两个目标中使用的相同目标文件

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