1

Linux で共有ライブラリを作成する方法を学んでおり、その後、並列化された科学計算プログラムを開発しています。ここから共有ライブラリのおもちゃの例を取り上げました。おもちゃの例に合わせて、この質問の Makefile を変更しました。私のMakefileは今

CC        = mpicc

INCDIR    = -I ./

CFLAGS    = -Wall -rdynamic -g -fPIC $(INCDIR)

LIBADD    = -L ./ -lcalc_mean

all: dyn_main.out

dyn_main.out: libcalc_mean.so
    $(CC) -o $@ main.c $(LIBADD)

libcalc_mean.so:    calc_mean.o
    $(CC) -shared --export-dynamic -o $@ $<

calc_mean.o: calc_mean.c
    $(CC) $(CFLAGS) -c $<

clean :
    -rm *.o
    -rm *.out
    -rm *.so

.PHONY:
    clean

Makefile で作成するとCC = gcc、問題なく動作します。mpirun でもバイナリを実行できました。

MakefileをCC = mpicc作成すると、次のエラーが発生します。

mpicc -Wall -rdynamic -g -fPIC -I ./ -c calc_mean.c
mpicc -shared --export-dynamic -o libcalc_mean.so calc_mean.o
mpicc -o dyn_main.out main.c -L ./ -lcalc_mean
/home/elan/localinstalls/lib/libmpi.so: undefined reference to `pthread_key_create'
/home/elan/localinstalls/lib/libmpi.so: undefined reference to `pthread_getspecific'
/home/elan/localinstalls/lib/libmpi.so: undefined reference to `pthread_create'
/home/elan/localinstalls/lib/libmpi.so: undefined reference to `pthread_atfork'
/home/elan/localinstalls/lib/libmpi.so: undefined reference to `pthread_setspecific'
/home/elan/localinstalls/lib/libmpi.so: undefined reference to `pthread_join'
collect2: ld returned 1 exit status
make: *** [dyn_main.out] Error 1

libpthread.so,.a へのパスを LD_LIBRARY_PATH に追加しましたが、役に立ちませんでした。私は自己コンパイルしたopenmpi-1.5.4を持っています。これがopenmpiの依存関係である場合、構成時に解決されているはずではありませんか?

このエラーはよく知られていますか? gcc 4.5.2 で Ubuntu 11.04 を使用しています。私はすでにいくつかの mpi 並列プログラムを正常に構築して実行しています。しかし、それらは autotools で構成された大きなパッケージです。config.log の 1 つに同じエラーが表示されます。しかし、それでも問題なく動作します。

mpi を使用して静的/共有ライブラリを作成する例への参照も歓迎します (ただし、Openmpi は完全に静的なライブラリを推奨していません)。

どうもありがとうございました、

エラン。


4

2 に答える 2

2

-lpthread を追加するだけでよいはずです。

Open MPI はおそらくそれを追加しませんでした。これは、-lpthread を追加する必要がないことが判明したためです (おそらく、pthread ライブラリを暗黙的にプルする他の依存関係が原因である可能性があります)。しかし、使用しているリンカー フラグを使用すると、その暗黙的な依存関係が変更された可能性があるため、pthread ライブラリは自動的に取り込まれなくなります。

コマンド ラインに -lpthread を追加すると問題が解決する場合は、次の FAQ エントリを参照して、ラッパー コンパイラを更新する方法を確認してください (独自のフラグを追加するなど): http://www.open-mpi.org/faq/?category= mpi-apps#override-wrappers-after-v1.0

于 2012-04-27T14:43:41.643 に答える
1

-showmeオプションまたはその特定のバリアントの 1 つを使用して、Open MPI コンパイラ ラッパーが基になるコンパイラとリンカーに提供するオプションを確認できます。

  • -showme:compileコンパイラフラグを表示するだけ
  • -showme:linkリンカーフラグを表示するだけです

例えば:

$ mpicc -showme
icc -I/opt/MPI/openmpi-1.5.3/linux/intel/include -I/opt/MPI/openmpi-1.5.3/linux/intel/include/openmpi -fexceptions -pthread -I/opt/MPI/openmpi-1.5.3/linux/intel/lib -Wl,-rpath,/opt/MPI/openmpi-1.5.3/linux/intel/lib -I/opt/MPI/openmpi-1.5.3/linux/intel/lib -L/opt/MPI/openmpi-1.5.3/linux/intel/lib -lmpi -ldl -Wl,--export-dynamic -lnsl -lutil
于 2012-05-04T12:55:45.103 に答える