【问题标题】:Inconsistent results from AC_CHECK_FUNCSAC_CHECK_FUNCS 的结果不一致
【发布时间】:2011-01-21 02:59:07
【问题描述】:

我在验证某些基本功能是否存在的配置脚本时遇到问题,

AC_CHECK_FUNCS([floor gettimeofday memset pow sqrt sin exp])

在某些条件下,结果是预期的 (checking for x... yes)。否则上面的数学函数声称没有定义。不同之处在于首先调用验证一些 lapack 例程。这些由AC_CHECK_LIB([lapack],[dsyev_],... 检查。如果没有先进行这些检查,则上述数学函数将无法检查(最终编译正常)。

我已将配置脚本简化为重现问题的以下脚本,

AC_INIT([TEST], [0.0], [none@none.com])
#AC_CHECK_LIB([lapack],[dsyev_], , AC_MSG_FAILURE([Missing lapack]))
AC_CHECK_FUNCS([floor gettimeofday memset pow sqrt sin exp])

取消注释第二行会产生正确的视觉结果。我想由于某种原因没有包含或检查数学库。事实上,AC_CHECK_LIB([m],[exp]) 工作正常。

这是什么原因,使用该指令的正确方法是什么?我应该注意哪些 x 平台注意事项?

【问题讨论】:

    标签: autotools autoconf configure


    【解决方案1】:

    数学函数在数学库中,所以如果你想要它们,你需要将数学库拉到configure 使用的链接参数中。 AC_CHECK_LIB([m],[exp]) 是一种方法。 AC_CHECK_LIB([lapack],...) 也有这种效果的原因是它很可能会引入 -lm 本身(不知道库,但我读它是为了线性代数)。

    我建议您避免使用AC_CHECK_LIB,而将AC_SEARCH_LIBS 用于可能不在标准C 库中的函数。所以

    AC_SEARCH_LIBS(exp, m)
    AC_SEARCH_LIBS(dsyev_, lapack)
    

    (但使用AC_CHECK_LIB实际上并没有错。)

    【讨论】:

    • 您对为什么搜索lapack 会在以后为ac_check_funcs 产生正确结果有更多见解吗?它必须修改环境,但是什么?
    • 为什么要使用 AC_SEARCH_LIBS?有系统优势吗?当我坐在配置文件的 1k 行前面时,“建议”只会走这么远。呃,当我终于彻底检查了这个配置脚本时,买了苏格兰公司的股票。
    • configure 将它找到的任何库添加到 LIBS 变量中,并将其用于后续测试。 lapack 可能与libm 链接,因此链接lapack 使libm 中的符号可用。
    • 使用AC_SEARCH_LIBS,您倾向于只提取您实际需要的库。例如,在某些平台上,某个函数可能位于libc 而不是libm,但仍然可能存在您不需要的libm。实践上的差异可能很小,但我认为它更干净。
    • 两者兼而有之可能在美学上更好。也就是说,首先调用 AC_CHECK_LIB 或 AC_SEARCH_LIBS(对于数学库,AC_CHECK_LIB 很好,因为您实际上不必检查“m”以外的任何名称)以在 LIBS 中获取 -lm,然后调用 AC_CHECK_FUNCS 以验证所有您需要的功能已经存在。这对 libm 来说可能是多余的(libm 的任何实现是否包括 sin 但不包括 cos?如果它是标准的则不是)但可能适用于不太稳定的库。
    猜你喜欢
    • 2014-09-21
    • 2021-03-27
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多