Как правильно использовать have_func, когда тестовой функции нужны аргументы?

У меня есть 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,

Оба теста не пройдены. Я полагаю, что первое терпит неудачу, потому что мне нужно dir_config линия для cblas и, возможно, have_library('cblas'),

Но я не могу понять, как пройти последний тест (см. Строку 24). Можно ли передать блок have_func так что на самом деле это называется разумными аргументами? Или есть другой способ запустить этот тест? Или я должен иметь dir_config вещи настроены правильно?

Кстати, строка 24:

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

И да, конечно, cblas_dgemm нужно много аргументов - некоторые из них матрицы.

Это расстраивает, как мало документации по любому из этих mkmf функции.

2 ответа

Решение

К сожалению похоже 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 работать правильно. Можете ли вы проверить, что это работает на вашем компьютере?

В mkmf.rb из ruby 1.9.3p392, Последний тест выполняется только в случае неудачи первого. Когда первый проходит, have_func Успехи. Так что вам не нужно делать последний проход. Ссылаться на try_func в mkmf.rb Больше подробностей.

Просто для информации, в mkmf.rb 2013-04-13 11:00:25, кажется, вы можете привести аргументы, как это: have_func("some_func(some_arg, another_arg)", ["foo.h"]),

Другие вопросы по тегам