Использование LAPACK в среде LINUX на C ++ - PullRequest
1 голос
/ 07 апреля 2020

это мой самый первый вопрос:)

Полагаю, он не квалифицирован, как должно, но это то, над чем я работаю, и было бы очень приятно узнать мнение кого-то по этому поводу.

В настоящее время я работаю над использованием LAPACK в среде на основе Linux, и я очень смущен этим. Я пытаюсь использовать C ++ , но я также могу кодировать с помощью Python. Прежде всего, у меня нет root в HP C, я подключаюсь к школьному серверу, поэтому я не настолько гибок, как мне нужно с точки зрения программного обеспечения.

Я могу писать и компилировать любые другие коды C ++, которые требуют базовых c включений, таких как string и так далее. Однако я не смог найти способ включить необходимые вещи или ссылки в проект LAPACK.

Например: Понимание вызовов LAPACK в C ++ на простом примере

//LAPACK test code
//compile with: g++ main.cpp -llapack -lblas -o testprog

#include <iostream>
#include <vector>

using namespace std;

extern "C" void dgetrf_(int* dim1, int* dim2, double* a, int* lda, int* ipiv, int* info);
extern "C" void dgetrs_(char *TRANS, int *N, int *NRHS, double *A, int *LDA, int *IPIV, double *B, int *LDB, int *INFO );


int main()
{
   char trans = 'N';
   int dim = 2;
   int nrhs = 1;
   int LDA = dim;
   int LDB = dim;
   int info;

   vector<double> a, b;

   a.push_back(1);
   a.push_back(1);
   a.push_back(1);
   a.push_back(-1);

   b.push_back(2);
   b.push_back(0);

   int ipiv[3];

   dgetrf_(&dim, &dim, &*a.begin(), &LDA, ipiv, &info);
   dgetrs_(&trans, &dim, &nrhs, & *a.begin(), &LDA, ipiv, & *b.begin(), &LDB, &info);


   std::cout << "solution is:";
   std::cout << "[" << b[0] << ", " << b[1] << ", " << "]" << std::endl;
   std::cout << "Info = " << info << std::endl;

   return(0);
}

Этот аргумент очень близок к тому, что я пытаюсь сделать, решить основную систему c с LAPACK. Когда я пытался использовать этот код, вот ошибка, с которой я сталкиваюсь:

g++ main.cpp -llapack -lblas -o testprog
/cta/capps/lapack/3.9.0/lib/../lib/liblapack.a(xerbla.f.o): In function `xerbla_':
xerbla.f:(.text+0x49): undefined reference to `_gfortran_st_write'
xerbla.f:(.text+0x54): undefined reference to `_gfortran_string_len_trim'
xerbla.f:(.text+0x69): undefined reference to `_gfortran_transfer_character_write'
xerbla.f:(.text+0x79): undefined reference to `_gfortran_transfer_integer_write'
xerbla.f:(.text+0x81): undefined reference to `_gfortran_st_write_done'
xerbla.f:(.text+0x8a): undefined reference to `_gfortran_stop_string'
collect2: error: ld returned 1 exit status

Мне действительно нужен совет или источник, чтобы понять логику c за LAPACK и связать ее с C ++.

Заранее спасибо ...

1 Ответ

1 голос
/ 07 апреля 2020

LAPACK написан на фортране. Ошибка компоновки указывает на то, что ваша версия LAPACK была скомпилирована с помощью gfortran, в котором есть вспомогательная (исполняемая) библиотека. Чтобы расширить другие комментарии, вам нужно связать эту библиотеку времени выполнения, чтобы предоставить недостающие функции. Попробуйте добавить -lgfortran к вашей ссылке (после -lblas), но перед -o. Надеюсь, это поможет.

...