如今,许多软件包都带有配置实用程序,以帮助设置编译器要求。如果需要,我可以提供一些更具体的示例,但是链接到两个库的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变量来解决问题吗?
答案 0 :(得分:3)
有一堆string functions非常有用。
您可以过滤出-std=
标志:
filtered := $(filter -std=%,$(CPPFLAGS))
然后按词汇顺序对其进行排序:
sorted := $(sort $(filtered))
然后只取最后一个:
highest := $(lastword $(sorted))
或者一劳永逸:
best_std_version := $(lastword $(sort $(filter -std=%,$(CPPFLAGS))))
如果其中一个标准版本是98,则此方法将无效。这就像是遍历Y2K的错误一样。但是您可以通过过滤将其解决。