【问题标题】:GNUMakefile and gcc: resolving the order of conflicting "-std=c++" requirementsGNUMakefile 和 gcc:解决冲突“-std=c++”要求的顺序
【发布时间】:2019-11-09 21:31:00
【问题描述】:

如今,许多软件包都带有配置实用程序来帮助设置编译器要求。如果需要,我可以给出更具体的示例,但是链接到两个库的 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++11PackageB-config --cflags 将产生 -std=c++17。 gcc 将使用最后出现的标志,并且由于所有标准都是向后兼容的,所以这很好而且很花哨。

但是如果我以“错误”的顺序编写我的 Makefile,那么 PackageB 先出现怎么办?现在 PackageA 的 -std=c++11 标志是实际使用的标志,编译失败。

有没有办法告诉 gcc 使用给定的最高标志,而不是只使用最后一个?如果没有,是否有解决这种头痛的标准方法?其他一切都失败了,一些大师可以通过操纵 Makefile 变量来解决问题吗?

【问题讨论】:

  • 厚脸皮的答案就是在最后坚持CPPFLAGS += -stdc++17。问题解决了。
  • @Barry 是的,除了我的特殊用例是科学网格计算,它通常针对更旧的编译器构建。甚至 c++11 支持仍然不是给定的

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


【解决方案1】:

有很多string functions 非常有用。

你可以过滤掉-std=标志:

filtered := $(filter -std=%,$(CPPFLAGS))

然后按词法排序:

sorted := $(sort $(filtered))

然后只取最后一个:

highest := $(lastword $(sorted))

或者,一次性完成:

best_std_version := $(lastword $(sort $(filter -std=%,$(CPPFLAGS))))

如果其中一个标准版本是 98,这将不起作用。这就像 Y2K 错误一样。但是你可以通过过滤它来处理它。

【讨论】:

  • 或将98 替换为03,这意味着同样的事情并且排序正确。为了真正安全起见,您还需要将-ansi 替换为-std=c++03,然后对使用-ansi 标志的人进行打击。
猜你喜欢
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2014-02-26
相关资源
最近更新 更多