0
0

More than 5 years have passed since last update.

Eclipseでlapackを用いたコード(C++)のコンパイル[Mac OS X ver. 10.10.3]

Last updated at Posted at 2015-05-05

対象

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での設定

  1. パッケージエクスプローラにあるビルド対象プロジェクトを右クリックし、「プロパティ」をクリックする。
  2. C/C++ビルドの「設定」をクリックする。
  3. 「ツール設定」タブの「MacOS X C++ Linker」->「その他」-> リンカー・フラグに以下の文字列を設定する。 -Wl,-framework -Wl,Accelerate

setting.png

以上で設定は完了です。

コンパイル

ビルド対象プロジェクトを右クリックし、「プロジェクトのビルド」を選択する。

build.png

以上でコンパイルは完了です。

以下の実対称行列対角化のサンプルコードを例に試してみて下さい。

#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;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0