更强大的 AC_COMPILE_IFELSE 功能测试?

2023-12-20

自动会议的AC_COMPILE_IFELSE在不同的编译器下,例如 Sun 的 C++ 编译器和 IBM 的 xlC 编译器,会错误地检测我们的功能。AC_COMPILE_IFELSE似乎会检查返回值,但有些编译器不会费心去设置它或将其设置为意外的值。后来,我们使用不可用的选项。

在我使用的非 Autoconf 构建脚本中"fatal|error|illegal|unrecognized|not found|not exist"检测编译器或链接器投诉。它比仅仅检查更稳健$?。测试看起来像:

# infile and outfile are temp files that allow testing a feature
SH_ERROR=$($CXX -Wl,--enable-new-dtags -o "$outfile" "$infile" 2>&1 | $EGREP -i -c -E 'fatal|error|illegal|unrecognized|not found|not exist')
if [[ "$SH_ERROR" -eq "0" ]]; then
    CXXFLAGS+="-Wl,--enable-new-dtags"
fi

Autoconf 文档AC_COMPILE_IFELSE is at 6.4 运行编译器 https://www.gnu.org/software/autoconf/manual/autoconf-2.66/html_node/Running-the-Compiler.html,但没有讨论主题。事实上,该文件甚至没有定义它的含义AC_COMPILE_IFELSE成为“成功[充分]”。

我的第一个问题是,编译器返回值是否在某处标准化?

我的第二个问题是,Autoconf 使用什么来确定“成功”?

我的第三个问题是,我们如何在 Autoconf 中做同样的事情?除了还有什么可以用的吗AC_COMPILE_IFELSE?

一个相关的问题是(基于 Stefan 的回答),我们如何让 Autoconf 使用改进的AC_COMPILE_IFELSE?电流下是否可以AC_COMPILE_IFELSE并将其定义为更健壮的版本?

提前致谢。


我的第一个问题是,编译器返回值是否在某处标准化?

我很确定除了所有退出代码的程序的明显标准之外,没有标准定义任何语言的编译器应该返回什么0意味着成功,其他一切都失败,请参阅POSIX 上exit http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html功能:

值为零(或EXIT_SUCCESS,要求为零),参数状态通常表示成功终止。这对应于规范exit()在 ISO C 标准中。该约定之后是 make 和各种 shell 等实用程序,它们将子进程的零状态解释为成功。因此,应用程序不应调用exit(0) or _exit(0)当它们终止失败时;例如,在信号捕获功能中。


我的第二个问题是,Autoconf 使用什么来确定“成功”?

最新的 autoconf 版本是 2.69(从 2012 年开始),尽管有些事情可能发生了变化,但我的答案将基于它。

AC_COMPILE_IFELSE http://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=blob;f=lib/autoconf/general.m4;hb=refs/tags/v2.69#l2568成功,当且仅当编译器有成功的退出代码(即0)并且目标文件不为空(test -s conftest.$ac_objext;它在运行编译器之前被删除)。如果AC_LANG_WERROR https://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Generic-Compiler-Characteristics.html#index-AC_005fLANG_005fWERROR-833用于当前语言它也确保the stderr编译器的输出为空 http://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=blob;f=lib/autoconf/general.m4;hb=refs/tags/v2.69#l2575(除了shell 跟踪日志行 http://git.savannah.gnu.org/gitweb/?p=autoconf.git;a=blob;f=lib/autoconf/general.m4;hb=refs/tags/v2.69#l2320).


我的第三个问题是,我们如何在 Autoconf 中做同样的事情?除了还有什么可以用的吗AC_COMPILE_IFELSE?

请记住,虽然 autoconf 源看起来很神奇,但事实并非如此 - 只要您知道您想要它们做什么,您就可以构建自己的宏:)但也许AC_LANG_WERROR https://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Generic-Compiler-Characteristics.html#index-AC_005fLANG_005fWERROR-833除了告诉供应商忍住并修复他们的垃圾之外,这是一个选择。

我不喜欢AC_LANG_WERROR: 我必须使用/etc/ld.so.preload几年前,在多架构系统上修复 flashplayer 的问题,从另一个架构运行二进制文件总是会打印一个无法加载它的错误,尽管它没有任何问题 -AC_LANG_WERROR在这样的环境下会严重破裂

作为自定义编译检查宏的示例,请看一下:

# MY_COMPILE_CLEAN_IFELSE(PROGRAM, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
# ---------------------------------------------------------------
# Try to compile PROGRAM.
AC_DEFUN([MY_COMPILE_CLEAN_IFELSE],
[AC_REQUIRE([AC_PROG_EGREP])
AC_COMPILE_IFELSE([$1],[retval=0
if $EGREP -i -c -E 'fatal|error|unrecognized|not found|not exist' conftest.err >/dev/null; then retval=1; fi
],[retval=1])
AS_IF([test $retval = 0],[$2],[$3])])

conftest.err之后被删除AC_COMPILE_IFELSE已经完成了,所以需要在内部actions中检查一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更强大的 AC_COMPILE_IFELSE 功能测试? 的相关文章

  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • 在 GCC 和 Clang 下,使用 lambda 的简单 RAII 包装器的复制初始化意外失败

    我在创建一个简单的 RAII 包装器时遇到了一个意想不到的问题 更不用说下面代码的逻辑不完整性了 复制构造函数和赋值运算符未删除等 这意味着是一个SSCCE 令我印象深刻的是复制初始化我的包装器与临时 lambda 的结果会导致编译错误 而
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • 如何在 Windows 窗体中运行屏幕保护程序作为其背景?

    如何在 Windows 窗体中运行屏幕保护程序作为其背景 用户还可以在屏幕保护程序运行时与表单控件进行交互 为什么这个 我们有一个案例 需要在用户时运行 Windows Bubbles 屏幕保护程序 可以继续与表单控件交互吗 您可以使用以下
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • C 中的模仿函数重写

    具体来说 函数重写能够调用基本重写方法 这有两部分 一个是预编译的库代码 1 另一个是库的用户代码 2 我在这里实现了一个尽可能最小的经典 Person 和 Employee 示例 非常感谢了解 OOP 概念的铁杆 C 开发人员的回应 我正
  • 用 C# 制作 Vista 风格的应用程序

    我正在运行 Windows Vista 并且希望外观看起来像常规 Vista 程序 有没有关于如何构建 Vista 风格应用程序的真正好的教程 文章 我还想学习如何使用本机代码并将其转换为 C 如this http bartdesmet n
  • 线程安全的 C++ 堆栈

    我是 C 新手 正在编写一个多线程应用程序 不同的编写者将对象推入堆栈 读者将它们从堆栈中拉出 或至少将指针推入对象 C 中是否有任何内置结构可以在不添加锁定代码等的情况下处理此问题 如果没有 那么 Boost 库呢 EDIT 你好 感谢您
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 微软语音识别速度

    我正在使用微软的语音识别器开发一个小型练习应用程序 对于我正在做的事情来说 我似乎无法让它足够快地识别单个单词 我希望能够正常说话 系统将从我所说的内容中抓取 关键字 并生成一个字符串 目前我正在使用 5 个单词的自定义语法 红 蓝 黄 绿
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 为什么 C# 接口名称前面加上“I”

    这种命名约定背后的基本原理是什么 我没有看到任何好处 额外的前缀只会污染 API 我的想法与康拉德一致response https stackoverflow com a 222502 9898与此相关的question https sta
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 创建带有部分的选项卡式侧边栏 WPF

    我正在尝试创建一个带有部分的选项卡式侧边栏 如 WPF 中的以下内容 我考虑过几种方法 但是有没有更简单 更优雅的方法呢 方法一 列表框 Using a ListBox并将 SelectedItem 绑定到右侧内容控件所绑定的值 为了区分标
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐