使用mpicc创建共享对象 - 似乎没有找到pthread例程

时间:2012-04-24 16:04:35

标签: shared-libraries openmpi

我正在学习在Linux中创建共享库,随后开发并行化的科学计算程序。我从here获取了玩具示例以获取共享库。我从this question修改了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依赖项,我配置它时不应该解决吗?

这个错误是否熟悉?我使用的是Ubuntu 11.04,gcc 4.5.2。我已经成功构建并运行了一些mpi并行程序。但它们是配置了autotools的大型软件包。其中一个config.log显示相同的错误。但即便是那个运行良好。

使用mpi创建静态/共享库的参考/示例也将受到赞赏(尽管Openmpi不鼓励使用完全静态的库。)

非常感谢,

Elan公司。


2 个答案:

答案 0 :(得分:1)

您应该只需添加-lpthread。

Open MPI可能没有添加它,因为它发现不需要添加-lpthread(可能是由于某些其他依赖隐式地拉入了pthread库)。但是使用您正在使用的链接器标志,您可能已经更改了该隐式依赖项,因此不会再自动引入pthread库。

如果在命令行中添加-lpthread可以解决问题,那么请参阅此FAQ条目以了解如何更新包装器编译器(例如,添加自己的标志):http://www.open-mpi.org/faq/?category=mpi-apps#override-wrappers-after-v1.0

答案 1 :(得分:1)

您可以使用-showme选项或其特定变体之一查看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