0

私はライブラリを使用するのが初めてで、lapack++とそれを機能させるのに問題があります。これまでに何をしてみたかを説明します。

最初にBLASとLAPACKをインストールしましたが、うまくいきました。LAPACK ++バージョン2.5.2(http://lapackpp.sourceforge.net/)をインストールしたので、C /C++でさまざまな線形代数ルーチンを呼び出すことができます。構成、make、make installを実行すると、すべてのC /C++ヘッダーファイルが/usr/ local / include /lapackpp/に配置されます。そのうちのいくつかは..です。

arch.h
bmd.h 
gmf.h    
lapackc.h 
lautil.h     
spdmd.h 
ultgmd.h
bfd.h
...

また、/ usr / local/lib内の次のファイル

liblapackpp.la
liblapackpp.so
liblapackpp.so.14
liblapackpp.so.14.2.0

ここで、g ++を使用してコンパイルしようとすると、次の単純なコードが使用されます。

#include <lapackpp/lapackpp.h>
using namespace std;

int main(int argc, char** argv) {
return 0;
}

次の出力が得られます...

In file included from /usr/local/include/lapackpp/lapackc.h:14,
from /usr/local/include/lapackpp/lapack.h:10,
from /usr/local/include/lapackpp/lapackpp.h:16,
from test.cpp:1:
/usr/local/include/lapackpp/lacomplex.h:45:23: error: laversion.h: No such file or directory
/usr/local/include/lapackpp/lacomplex.h:48:17: error: f2c.h: No such file or directory
In file included from /usr/local/include/lapackpp/lapackpp.h:47,
from test.cpp:1:
/usr/local/include/lapackpp/latmpl.h:36:22: error: lafnames.h: No such file or directory

問題の原因となったヘッダーファイルにヘッダーファイルの場所を明示的に書き込むことで、この問題を解決しました。

例えば。#includeを#includeに置き換えました

これを行った後、私のコードは正常にコンパイルされます。

コードをコンパイルしようとすると

#include <cstdlib>
#include <iostream>
#include <lapackpp/lapackpp.h>

using namespace std;

int main(int argc, char** argv) {

LaGenMatDouble A(5,5);
cout << "This is a test." << endl;

return 0;
}

入力して

g++ test.cpp -o test -I usr/local/include/lapackpp

次のエラーが発生します

/tmp/ccAq6nkP.o: In function `main':
test.cpp:(.text+0x22): undefined reference to `LaGenMatDouble::LaGenMatDouble(int, int)'
test.cpp:(.text+0x4f): undefined reference to `LaGenMatDouble::~LaGenMatDouble()'
test.cpp:(.text+0x67): undefined reference to `LaGenMatDouble::~LaGenMatDouble()'
collect2: ld returned 1 exit status

(LaGenMatDoubleに関する情報はこちらです

これは、私がライブラリに間違ってリンクしている可能性があることを示唆していますか?

少しグーグルした後、-Iを使用してヘッダーファイルにリンクし、-Lで共有ライブラリにリンクし、-llapackppでライブラリ自体にリンクする必要があることに気付いたので、次のように入力しました。

g++ test.cpp -o test -I usr/local/include/lapackpp -L usr/local/lib -llapackpp

コードをコンパイルしました。./testと入力してプログラムを実行すると、エラーが発生します。

./test: error while loading shared libraries: liblapackpp.so.14: cannot open shared object file: No such file or directory

そして今、私は混乱しています。

これが問題と関係があるかどうかはわかりませんが、入力すると

pkg-config lapackpp --libs

私は得る

パッケージlapackppがpkg-config検索パスに見つかりませんでした。おそらく、`lapackpp.pc'を含むディレクトリをPKG_CONFIG_PATH環境変数に追加する必要があります。パッケージ'lapackpp'が見つかりません

同じことがlapackとblasにも起こります。

どうしたらいいかわからない。どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2

1

ライブラリがどこにあるかをリンカに通知するため、リンクは正常に行われますが、ローダーがライブラリの場所について何も知らないため、実行に失敗しました(実行ldd yourapp中を確認できます。これにより、アプリケーションに必要なライブラリが表示されます)。

通常、ライブラリが変数を介してどこにあるかをローダーに伝えることでそれを解決できますが LD_LIBRARY_PATH、これは大雑把なツールです。別の解決策は、ここで説明するように、その命令を実行可能ファイルに直接エンコードするか、スイッチを使用してアプリケーションを静的にリンクすることです。-static

于 2012-05-23T11:34:38.313 に答える
0

LAPACK(および/またはBLAS)をラップするC ++ライブラリを使用している場合は、 Armadilloなどの最新のライブラリを使用した方がよい場合があります。LAPACKをソルバーと行列因数分解のバックエンドとして使用することに加えて、式テンプレートを使用して操作を高速化します。

于 2012-12-18T09:53:42.260 に答える