我有一个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时,我看到这个检查实际上查找两件事:
-
_cblas_dgemm
符号在某处(?)
cblas.h
中可调用的cblas_dgemm
。两个测试都失败。我认为前者是失败的,因为我需要dir_config
行cblas
,也许have_library('cblas')
。
但是我不知道如何使后一个测试通过(参见要点的第24行)。是否有可能将块传递给have_func
,因此它实际上使用合理的参数调用它?还是有其他方法来做这个测试?或者我必须有dir_config
的东西设置正确?
conftest.c:7:1: error: too few arguments to function ‘cblas_dgemm’
当然,cblas_dgemm
需要很多参数——其中一些是矩阵。
令人沮丧的是,这些mkmf
函数的文档很少。
不幸的是,看起来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
正常工作。您能验证这在您的机器上是否有效吗?
在ruby 1.9.3p392
的mkmf.rb
中,只有前一个测试失败才执行后一个测试。当前者通过时,have_func
成功。所以你不必通过后一种方法。详细信息请参考mkmf.rb
中的try_func
。
仅供参考,在mkmf.rb
2013-04-13 11:00:25,似乎你可以给出这样的参数:have_func("some_func(some_arg, another_arg)", ["foo.h"])
.