私はLinuxが初めてです。2 つの Linux マシン、1 つの 40 コア サーバー (A) と 1 つのクラスター (B) にアクセスできます。両方のマシンで同じことをしようとしていますが、A では動作しますが、B では動作しません。どちらにも sudo 権限がありません。A は、debian スクイーズ/sid で実行されます。B はカーネル 2.6.18-238.el5 で動作します。/etc の下にリリース情報ファイルが見つかりませんでした。A には gcc 4.6.2 があり、B には gcc 4.1.2 があります。
特定のメッシング ソフトウェア Pkg1 と特定のソルバーである Pkg2 を両方のマシンにローカルにコンパイルしてインストールしました。どちらも Libtool と automake が必要です。Pkg2 は .so ファイルです。すべて正常に動作し、例を実行できました。コードは mpicxx でビルドされました。どちらも mpi コンパイラが異なります。A は openmpi154 を使用し、B は qlogicmpi_gnu-0.1.0 を使用します。
ここで、私のコード、たとえば Pkg3、いくつかの .cpp ファイルを紹介します。私はそれから .so を構築しました。Libtool と automake は使用しませんでした。コンパイラとリンカとして gcc を使用した単純な make ファイル (mpicxx も試しました) が使用されました。
A では、Pkg3 は問題なく動作します。B では、Pkg3 がクラッシュします。メッセージ St8bad_cast を使用して、Pkg3 の一部の型を Pkg2 で定義された型に動的にキャストしようとすると、クラッシュします。別のデータ ファイルの場合、Pkg2 の関数が Pkg3 から型をキャストしようとすると、「要素の型は N5ngfem8FE_Segm2E 期待される型は N5ngfem19ScalarFiniteElementILi1EEE です」というメッセージでクラッシュします。
どこで問題を探すのですか? 曖昧でごめんなさい。ここにあるソフトウェアはすべてオープンソースですが、パッケージが大きすぎて、自己完結型の再現を少しの作業で作成することはできません。automake と Libtools も、mpi もまだ使用していないため、問題が悪化しています。Pkg1 と Pkg2 の makefile を調べて、単純な makefile で CXX、LDFLAGS などをマップしようとしましたが、automake/libtools によって作成された複数の間接化が困難です。
Pkg2 のシンボルは、シンボル テーブルで Pkg3 のシンボルとは異なる方法でマングルされていることを理解しています。しかし、それはリンカの世話をするべきだった?! Pkg3 の「-Wl、-E」オプションありとなしの両方を試しました。-fPIC は常にあります。Pkg3 をリンクするルールは、ライブラリ Pkg2 () を指します。Pkg3のmakefile本体を掲載しました。
%.o : %.cpp
gcc -O2 -fopenmp -fPIC -DNETGEN_ELTRANS -DUSE_TIMEOFDAY -DLAPACK -I. -I$(NETGENDIR)/../include -c $? -o $@
libmyngsolve.so : $(objects)
gcc -shared -Wl,-E -fopenmp -fPIC $(objects) -L/home/lv70227/elan/ng/lib -lngsolve -o $@
clean:
rm *.o libmyngsolve.so
注 1:
./configure
Pkg2のコマンドには-Wl,--start-group -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -Wl,--end-group -lpthread
、つまり、-E フラグがありません。しかし、それが参考として私に指定された方法です。
注 2:
リンク規則 -L/home/lv70227/elan/ng/lib で定義されたパスには、pkg2.so.0.0.0、それへの 2 つのシンボリック リンク、および pkg2.sa ではなく pkg2.la があります。 libtools.
問題がどこにあるのかについてのヒントをいただければ幸いです。A と B にインストールされているさまざまな mpi、gcc、mkl ライブラリに対応するために、両方のマシンで同じ手順に従いました。
ありがとう、エラン。