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

当测试函数需要参数时,have_func的正确用法是什么?,c,ruby,atlas,extconf.rb,mkmf,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 所以,cbl

我有一个带有以下行的
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
中。当我查看时,我发现这张支票实际上查找了两件事:

  • 某个符号(?)
  • cblas.h
    中可调用的
    cblas_ggemm
  • 两项测试都失败了。我假设前者失败了,因为我需要
    cblas
    dir\u config
    行,可能还需要
    have\u库('cblas')

    但我不知道如何使后一个测试通过(请参见第24行)。是否可以将一个块传递给have_func,以便它实际使用合理的参数调用它?或者是否有其他方法来运行此测试?或者我必须正确设置
    dir\u config
    stuff吗

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

    conftest.c:7:1: error: too few arguments to function ‘cblas_dgemm’
    
    当然,是的,
    cblas_ggemm
    需要很多参数——其中一些是矩阵


    令人沮丧的是,关于这些
    mkmf
    函数的文档太少了。

    ruby 1.9.3p392
    mkmf.rb
    中,后一个测试只有在前者失败时才会执行。当前者通过时,
    有_func
    成功。所以你不必通过后者。有关详细信息,请参阅
    mkmf.rb
    中的
    try_func


    仅供参考,在中,您似乎可以给出如下参数:
    have_func(“some_func(some_arg,other_arg)”,[“foo.h”)

    不幸的是,
    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('cblas_dgemm')?这可能只是尝试链接引用
    cblas_ggemm
    函数的内容,而根本不涉及标题。不过,您需要先找出合适的
    -l
    开关。我已经找到了,而且在某些情况下它也能工作,但由于缺乏文档,几乎无法预测何时会发生。为什么没有人费心重写
    mkmf
    ?这似乎是重写的好人选。谢谢你,这对我帮助很大