gpt4 book ai didi

c++ - 如何强制 GNU make 重新编译在具有不同 FLAGS 的两个目标中使用的相同目标文件

转载 作者:太空狗 更新时间:2023-10-29 20:08:29 24 4
gpt4 key购买 nike

假设您有一个包含两个目标的 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

targetAtargetB共享一个文件,即commonFile.cpp,里面包含了一些#include d 标题。commonFile.o 仅由 GNU make 创建一次,并在 targetB 的编译期间重复使用。

targetA 中存在的 CPPFLAGS 使编译器使用包含比默认包含目录中的符号更多符号的包含。 libUsedByCommon2 不会导出 fakeinclude 目录中 header 中包含的所有附加符号,并且在链接时,这会导致 undefined reference

我目前使用的解决方法是创建一个指向 commonFile.cpp 的符号链接(symbolic link),并在我的 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++ - 如何强制 GNU make 重新编译在具有不同 FLAGS 的两个目标中使用的相同目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53709886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com