c++ - GNUMakefile 和 gcc : resolving the order of conflicting "-std=c++" requirements

标签 c++ c++11 gcc makefile c++17

现在许多软件包都带有一个配置实用程序来帮助设置编译器要求。如果需要,我可以给出更具体的例子,但是链接到两个库的 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/

相关文章:

C++ 多个构造函数初始化和销毁

c++ - 迭代器在最后一个元素上返回 "Junk"

c++ - 让 g++ 产生一个可以使用多核的程序?

c - 使用另一个数组索引一个数组 - gcc 6.3 运行时错误

c++ - 我可以指定在 C/C++ 中是否限制或溢出整数吗?

c++ - 对涉及特定类成员的实例集合执行操作

c++ - 无法从 'unsigned int' 转换为 'unsigned int&'

c++11 - 谷歌/基准 : BENCHMARK_TEMPLATE syntax

C++ 无序映射好数量的桶

为 Mips 架构编译 C