现在许多软件包都带有一个配置实用程序来帮助设置编译器要求。如果需要,我可以给出更具体的例子,但是链接到两个库的 Makefile 可能有类似的东西:
CPPFLAGS += $(shell PackageA-config --cflags)
CPPFLAGS += $(shell PackageB-config --cflags)
%.o : %.cc
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
现在假设 PackageA 至少需要 c++11,而 PackageB 需要 c++17,即 PackageA-config --cflags
会产生 -std=c++11
和 PackageB-config --cflags
将产生 -std=c++17
。 gcc 将使用最后出现的标志,并且由于所有标准都是向后兼容的,所以这很好而且花花公子。
但是如果我以“错误”的顺序编写我的 Makefile,以至于 PackageB 排在第一位怎么办?现在 PackageA 的 -std=c++11
标志是实际使用的标志,编译失败。
有没有办法告诉 gcc 使用给定的最高标志,而不是只使用最后一个标志?如果没有,是否有解决这种头痛的标准方法?其他一切都失败了,一些大师可以通过操纵 Makefile 变量来解决这个问题吗?
最佳答案
有一堆string functions知道这些非常有用。
您可以过滤掉 -std=
标志:
filtered := $(filter -std=%,$(CPPFLAGS))
然后按词法排序:
sorted := $(sort $(filtered))
然后只取最后一个:
highest := $(lastword $(sorted))
或者,一气呵成:
best_std_version := $(lastword $(sort $(filter -std=%,$(CPPFLAGS))))
如果其中一个标准版本是 98,这将不起作用。这就像 Y2K bug 又来了。但是您可以通过过滤掉它来处理它。
关于c++ - GNUMakefile 和 gcc : resolving the order of conflicting "-std=c++" requirements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56798167/