我正在学习在 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
当我CC = gcc
在 Makefile 中使用时,一切正常。即使使用 mpirun,我也可以运行二进制文件。
当我CC = mpicc
在 Makefile 中时,我收到以下错误。
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 并行程序。但它们是配置了自动工具的大型软件包。config.log 之一显示相同的错误。但即使那个运行良好。
对使用 mpi 创建静态/共享库的参考/示例也将不胜感激(尽管 Openmpi 不鼓励完全静态库。)
非常感谢你,
艾伦。