我正在学习在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公司。
答案 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