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 は完全に静的なライブラリを推奨していません)。
どうもありがとうございました、
エラン。