対象
EclipseでMac OS標準で装備されているlapackを用いたコード(C++)のコンパイル方法を知りたい方
ネットでの情報が少なかったため、メモを残す。
Mac OSのバージョン
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.10.3
BuildVersion: 14D136
Eclipseのバージョン
Version: Luna Service Release 2 (4.4.2)
「Eclipse」 -> 「Eclipseについて」で確認
ヘッダファイルのシンボリックリンク作成
clapack.h等のヘッダファイルは以下のパスに格納されている。
$ ls -l /System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Versions/Current/Headers/
LinearAlgebra/ clapack.h vBigNum.h vDSP_translate.h vecLib.h vectorOps.h
cblas.h vBasicOps.h vDSP.h vForce.h vecLibTypes.h vfp.h
Eclipseでビルドするため、以下のようにファイルのシンボリックリンクを作成する。
$ sudo ln -s /System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Versions/Current/Headers/* /usr/include/
Eclipseでの設定
- パッケージエクスプローラにあるビルド対象プロジェクトを右クリックし、「プロパティ」をクリックする。
- C/C++ビルドの「設定」をクリックする。
- 「ツール設定」タブの「MacOS X C++ Linker」->「その他」-> リンカー・フラグに以下の文字列を設定する。
-Wl,-framework -Wl,Accelerate
以上で設定は完了です。
コンパイル
ビルド対象プロジェクトを右クリックし、「プロジェクトのビルド」を選択する。
以上でコンパイルは完了です。
以下の実対称行列対角化のサンプルコードを例に試してみて下さい。
#include <iostream>
#include <cmath>
#include <clapack.h>
using namespace std;
int main() {
// 行列サイズ
int M = 3;
// 対角化する行列(固有ベクトルが格納される)
double* A = new double[M * M];
for (int i = 0; i < M; i++) {
for (int j = 0; j < M; j++) {
A[i * M + j] = 1.0;
}
}
// 固有値
double w[M];
int info;
int lwork = -1;
double* work = new double[1];
char* V = const_cast<char*> (((string)"V").c_str());
char* U = const_cast<char*> (((string)"U").c_str());
dsyev_(V, U, &M, A, &M, w, work, &lwork, &info);
lwork = work[0];
delete[] work;
work = new double[lwork];
dsyev_(V, U, &M, A, &M, w, work, &lwork, &info);
delete[] work;
if (info != 0) {
cout << "error!" << endl;
return EXIT_FAILURE;
} else {
cout << "eigen values:" << endl;
for (int i = 0; i < M; i++) {
printf("%f \t", w[i]);
}
cout << endl;
cout << "eigen vector:" << endl;
for (int i = 0; i < M; i++) {
for (int j = 0; j < M; j++) {
cout << A[i * M + j] << " \t";
}
}
}
delete[] A;
return EXIT_SUCCESS;
}