Обертывание фортрановой функции в C ++: броненосец с LAPACK - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь скомпилировать сборку для разработки, и я получаю эту ошибку во время компиляции:

имя неизвестного типа 'dgeqp3'

функция не может возвращать тип функции 'void ( int *, int *, double *, int *, int *, double *, double *, int *, int *) '

использование необъявленного идентификатора' dgeqp3 '

Файл, который вызывает ошибку, является arma_extra. C, который должен быть дополнением к Armadillo (библиотека C ++ для линейной алгебры и вычислений scientifi c). Первые несколько строк (вам лучше поверить, что я получаю те же сообщения об ошибках для zqep3):

#include <cassert>
#include <sstream>
#include "arma_extra.h"
#ifdef DEVBUILD
#include <DEVBUILD.h>
#undef dgeqp3
#undef zgeqp3
#endif


/*!
 * Convert an integer to a string.
 */
#define SSTR( x ) static_cast< std::ostringstream & >( \
        ( std::ostringstream() << std::dec << x ) ).str()

extern "C" {
void arma_fortran_noprefix(dgeqp3)(int*,int*,double*,int*,int*,double*,double*,int*,int*);
void arma_fortran_noprefix(zgeqp3)(int*,int*,std::complex<double>*,int*,int*,std::complex<double>*,std::complex<double>*,int*,double*,int*);
}

dgeqp3 - это функция LAPACK (библиотека Фортрана 90 для линейной алгебры), так что похоже, что Армадилло пытается использовать некоторые функции из LAPACK. Я не знаком с объявлением функции в форме

data_type my_function(what's this)(int,...);

Я предполагаю, что это своего рода обтекание, следовательно внешний "C" для предотвращения перегрузки функции?

Но я прочитал в другом месте , что этот вид синтаксиса запрещен, поскольку функции не могут возвращать функции. Действительно, это, кажется, второе из трех сообщений об ошибках, которые я получаю. Я немного отчаялся, поэтому любая помощь будет очень признательна.

...