当测试函数需要参数时,has_func的正确用法是什么?

时间:2013-03-31 04:01:49

标签: c ruby atlas extconf.rb mkmf

我有一个extconf.rb,其中包含以下几行:

have_header("cblas.h")                 # checking for cblas.h... yes
have_func("cblas_dgemm", ["cblas.h"])  # checking for cblas_dgemm() in cblas.h... no
create_header("nmatrix_config.h")      # creating nmatrix_config.h

因此,cblas_dgemm肯定在cblas.h。当我查看mkmf.log时,我发现这个检查实际上找了两件事:

  1. 某处_cblas_dgemm符号(?)
  2. cblas_dgemm中的可调用cblas.h
  3. 两项测试都失败了。我认为前者失败了,因为dir_config需要cblas行,可能是have_library('cblas')

    但我无法弄清楚如何使后一个测试通过(参见gist的第24行)。是否可以将块传递给have_func,以便它实际上用合理的参数调用它?或者还有其他方法来运行此测试吗?或者我必须正确设置dir_config内容吗?

    顺便说一句,这是第24行:

    conftest.c:7:1: error: too few arguments to function ‘cblas_dgemm’
    

    是的,当然,cblas_dgemm需要很多参数 - 其中一些是矩阵。

    令人沮丧的是,这些mkmf函数中的任何文档都很少。

2 个答案:

答案 0 :(得分:3)

不幸的是,have_func看起来很难记录,但在一些挖掘中我发现了一些可能有用的东西:

[25] pry(main)> have_func("clapack_dgetrf", "/usr/local/atlas/include/clapack.h")
checking for clapack_dgetrf() in /usr/local/atlas/include/clapack.h... no
=> false
[26] pry(main)> have_func("int clapack_dgetrf", "/usr/local/atlas/include/clapack.h")
checking for int clapack_dgetrf() in /usr/local/atlas/include/clapack.h... yes
=> true

因此,基本上看起来您需要至少包含返回类型才能使have_func正常工作。你能验证这在你的机器上有效吗?

答案 1 :(得分:0)

mkmf.rb的{​​{1}}中,后一个测试仅在前者失败时执行。当前者通过时,ruby 1.9.3p392成功。所以你不必让后者通过。有关详细信息,请参阅have_func中的try_func

仅供参考,在mkmf.rb on 2013-04-13 11:00:25中,您似乎可以提供这样的参数:mkmf.rb