私はLAPACKのライブラリサブルーチンdsyevを使って行列を対角化する必要があるプログラムを書いています。まず、BLASライブラリとLAPACKライブラリを正しくリンクしていることを確認するためにテストコードを使用しました。このコードは次のとおりです。C++、LAPACK:ライブラリがリンクされた `dsyev 'への未定義参照
// LAPACK test code
//compile with: g++ -Wall -L/lib64 -llapack -lblas LAPACK_testcode.cpp -o LAPACK_testcode.x
#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);
}
このコードはコンパイルされ、問題なく走ったので、私はこの問題は、ライブラリをリンクすると問題になることを期待しないでください。代わりに、ここにコードを掲示するの
、単にハイパーリンクを表示します。私は、次のIntelのWebサイトからdsyev例Cプログラムを実行しました。このプログラムを実行する(私はC++プログラムとしてそれを保存し、LAPACK関数プロトタイプをextern「C」を持っていたことを確認した)次のエラーを得られます。
:私は同様のエラーを持っていた私のプログラムを、試してみましたそして、dsyev_example.cpp: In function ‘int main()’:
dsyev_example.cpp:95:74: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
dsyev_example.cpp:95:74: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
dsyev_example.cpp:99:72: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
dsyev_example.cpp:99:72: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
dsyev_example.cpp:106:49: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
dsyev_example.cpp:108:72: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
/tmp/ccpoVl5n.o: In function `main':
dsyev_example.cpp:(.text+0x8b): undefined reference to `dsyev'
dsyev_example.cpp:(.text+0xf7): undefined reference to `dsyev'
collect2: error: ld returned 1 exit status
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include "timer.h"
using namespace std;
const int N = 10; // Matrix is of size N x N
// ****** NEED TO LINK BLAS AND LAPACK LIBRARIES IN ORDER TO COMPILE ******
// g++ -Wall -L/lib64 -llapack -lblas matrix_multiply.cpp -o matrix_multiply.x
/* DSYEV prototype */
extern "C"
{
void dsyev(char* jobz, char* uplo, int* n, double* a, int* lda,
double* w, double* work, int* lwork, int* info);
}
/* DGEMM prototype */
extern "C"
{
void dgemm(const char *transa, const char *transb, int *l, int *n,
int *m, double *alpha, const void *a, int *lda, void *b,
int *ldb, double *beta, void *c, int *ldc);
}
/* Auxiliary routines prototypes */
extern "C"
{
void print_matrix(char* desc, int m, int n, double* a, int lda);
}
void initialize (double a [N][N]);
void print (int m, int n, double a [N][N]);
int main()
{
// declaration of matrix
double A [N][N];
// call initialize to initialize matrix here
initialize (A);
cout << "The initial matrix A is:\n";
// call print to print matrices here
print (N, N, A);
// Declaring Function Input for DSYEV
char jobz = 'V'; // 'V': Compute eigenvalues and eigenvectors.
char uplo = 'U'; // 'U': Upper triangle of A is stored.
int n = N; // The order of the matrix A, with n >= 0.
int lda = N; // The leading dimension of the array A, LDA >= max(1,N).
int lwork = N * N; // The length of the array work, lwork >= max(1,3*N-1).
int info = 1; // = 0: successful exit
double w[N]; // w = array of eigenvalues in ascending order
double work[N]; // work =
// Convert 2d array into 1d array for use in dsyev
double b [N*N];
for (int q = 0; q < n; q++)
{
for (int t = 0; t < n; t++)
{
b[q * n + t] = A[q][t];
}
}
// Print 1d array
for (int i = 0; i < N * N; i++)
{
cout << setw (8) << i << " ";
}
dsyev(&jobz, &uplo, &n, b, &lda, w, work, &lwork, &info);
/* Check for convergence with dsyev */
if(info > 0)
{
cout << "The algorithm failed to compute eigenvalues." << endl;
exit(1);
}
/* Print eigenvalues */
print_matrix("Eigenvalues", 1, n, w, 1);
/* Print eigenvectors */
print_matrix("Eigenvectors (stored columnwise)", n, n, b, lda);
/*
timespec before, after;
get_time(&before);
// O(N^3) ALGORITHM FOR TWO-INDEX SIMILARITY TRANSFORMATION
for (int j = 0; j < N; j++)
{
for (int p = 0; p < N; p++)
{
int sum = 0;
for (int q = 0; q < N; q++)
{
sum += F[p][q] * T[q][j];
}
G[p][j] = sum;
}
}
for (int j = 0; j < N; j++)
{
for (int i = 0; i < N; i++)
{
int sum = 0;
for (int p = 0; p < N; p++)
{
sum += T[p][i] * G[p][j];
}
H[i][j] = sum;
}
}
get_time(&after);
timespec time_diff;
diff(&before,&after,&time_diff);
// Time in seconds
double time_s = time_diff.tv_sec + (double)(time_diff.tv_nsec)/1.0e9;
cout << "\nThe time for the operation was " << time_s << endl;
// call print to print result here
print();
*/
cout << "\n\n";
return 0;
}
// initialize sets all values in the matrix to desired form
void initialize (double a [N][N])
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
a [i][j] = 1.0;
a [j][i] = 1.0;
if (i < 5)
{
a [i][i] = 1.0 + (0.1 * i);
}
if (i > 5)
{
a [i][i] = 2 * (i + 1.0) - 1.0;
}
}
}
}
// prints the matrix
void print (int m, int n, double a [N][N])
{
for (int i = 0; i < m; i++)
{
cout << endl;
for (int j = 0; j < n; j++)
cout << setw (8) << a [i][j];
}
cout << endl;
}
/* Auxiliary routine: printing a matrix */
void print_matrix(char* desc, int m, int n, double* a, int lda)
{
int i, j;
printf("\n %s\n", desc);
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++) printf(" %6.2f", a[i+j*lda]);
printf("\n");
}
}
そして再び、私は次のエラーを取得する:
matrix_multiply.cpp: In function ‘int main()’:
matrix_multiply.cpp:91:45: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
matrix_multiply.cpp:93:68: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
/tmp/ccVXf4OM.o: In function `main':
matrix_multiply.cpp:(.text+0x229): undefined reference to `dsyev'
collect2: error: ld returned 1 exit status
両方LAPACKおよびBLASライブラリは(liblapack.soとlibblas.soなど)に/ lib64に位置しています。使用されているコマンドは、両方のポストされたプログラムの先頭にコメントされています。テストプログラムが正常に実行されたことを考えれば、問題はライブラリをリンクしていないと思いますか?誰かが問題の原因となるものを手がかりにしていれば、私はポインタに感謝します。ありがとう!
優秀でコンパイルされました!非常に徹底的な対応に感謝します。 –