如何在configure.ac中检查特定的gcc特性?
how can I check a particular gcc feature in configure.ac
例如,gcc 4.7有一个新特性- wnarrowness。在配置。我如何测试当前gcc是否支持某个特性?
在gnulibc中有一个文件,但对我来说没有多大意义。
gcc和clang都支持-W[no-]narrowing
和-W[no-]error=narrowing
选项
对于-std=c++11
, gcc默认发出警告, clang默认发出错误。尽管您只提到了gcc,但我认为您可以将功能检查扩展到像clang这样试图提供相同选项和扩展的编译器。这可能也包括英特尔的icc。
让我们假设您已经选择了带有AC_PROG_CXX
的c++编译器,并确保它使用c++ 11标准。
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS -Werror -Wno-error=narrowing"
AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
[[int i {1.0}; (void) i;]])],
[ac_cxx_warn_narrowing=1], [ac_cxx_warn_narrowing=0])
AS_IF([test $ac_cxx_warn_narrowing -ne 0],
[AC_MSG_RESULT(['$CXX' supports -Wnarrowing])])
AC_LANG_POP([C++])
CXXFLAGS="$ac_save_CXXFLAGS"
编译只有在以下情况下才能成功:1)编译器支持-Wnarrowing
相关选项,这意味着它支持-Werror
,并且:2)识别c++ 11初始化语法。
通常,传递给configure的configure.ac
脚本和标志应该避免-Werror
,因为它破坏了太多的内部测试。在这种情况下,我们确保除了收缩之外没有其他警告,这就是为什么需要(void) i;
来防止关于未使用变量的警告。
这背后的逻辑应该是:
创建一个正确的文件,使用-Wnarrowing
应该得到一个警告。验证它是否被正确编译。
然后用-Wnarrowing
编译相同的文件,并验证它仍然被正确编译。这可以确保您检测到不支持-Wnarrowing
作为选项的编译器,并且不会试图将虚假选项传递给它们。
最后,用-Werror=narrowing
编译相同的文件,并验证它现在没有被正确编译。如果现在失败了,您可以相当肯定编译器确实支持-Wnarrowing
。最后一项检查对于检测接受-Wnarrowing
/-Werror=narrowing
的编译器很有用,但会发出警告"忽略未知选项- wnarrow"。在这种情况下,你不应该传递-Wnarrowing
。
可选地,您可能还希望编译一个不应该在-Wnarrowing
和-Werror=narrowing
中获得警告的文件,以防您发现-Wnarrowing
无用而-Werror=narrowing
是硬错误的编译器。但是,我想不出有哪个编译器需要这样做。
将其转换为配置检查应该是微不足道的。
请参阅http://code.google.com/p/opendoom/source/browse/trunk/VisualC8/autotools/ac_c_compile_flags.m4以获得此类示例测试-该测试尝试使用给定的编译器标志编译一个普通程序,并在其工作时将其添加到CFLAGS中。
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么 gcc 编译这个而 msvc 没有
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 如何在configure.ac中检查特定的gcc特性?
- cygwin上的gcc 4.7.3支持c++ 11并发特性吗?
- 当使用(自定义)GCC 4时,Boost构建无法进行c++ 11特性检查.X或5