如何强制g++ 5.4.0仅使用无需C++11支持的系统头文件?
首先明确:没法直接强制g++ 5.4.0使用“完全无需C11支持”的系统头文件——因为g 5.4.0配套的libstdc库已经整合了C11相关的头文件(比如<type_traits>),这些头文件本身就会检查编译模式是否开启C11,没有单独的纯C98版本头文件分支可以切换。
但可以通过修改wxWidgets的条件编译逻辑绕开这个问题,具体操作如下:
核心思路
问题出在wxWidgets 2.9.4的strvararg.h中:当HAVE_TYPE_TRAITS宏被定义时,会直接包含C11的<type_traits>头文件,而g 5.4.0在默认的gnu++98模式下(兼容老编译器的模式),这个头文件会触发C11支持的检查报错。我们需要让wxWidgets改用TR1版本的类型特性头文件,而非C11版本的。
具体操作
在编译命令中添加以下宏定义:
-U HAVE_TYPE_TRAITS -D HAVE_TR1_TYPE_TRAITS=1
-U HAVE_TYPE_TRAITS:取消HAVE_TYPE_TRAITS的定义,避免wxWidgets包含C++11的<type_traits>。-D HAVE_TR1_TYPE_TRAITS=1:强制让wxWidgets使用TR1版本的<tr1/type_traits>,这个头文件在g++ 5.4.0的gnu++98模式下可正常使用,无需开启C++11支持。
验证逻辑
修改后,wxWidgets的strvararg.h会走#elif defined(HAVE_TR1_TYPE_TRAITS)分支,对于g来说会包含<tr1/type_traits>,这个头文件属于C TR1扩展,在g++ 5.4.0的默认模式下无需额外编译开关即可支持,不会触发C++11的检查报错,同时也能兼容老编译器(如RHEL6上的编译器)的构建流程。
备选方案(如果上述方法无效)
如果TR1头文件也有问题,可以直接强制让wxWidgets不包含任何类型特性头文件:
-U HAVE_TYPE_TRAITS -U HAVE_TR1_TYPE_TRAITS
这种情况需要确保wxWidgets的代码在不依赖type_traits的情况下也能正常编译——wxWidgets 2.9.4针对老编译器应该有 fallback 逻辑,不过建议优先尝试第一种方案。
内容的提问来源于stack exchange,提问作者Shane Bishop

