【发布时间】: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++11,PackageB-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