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

当我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 不鼓励完全静态库。)

非常感谢你,

艾伦。


4

2 回答 2

2

您应该可以只添加 -lpthread。

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

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

于 2012-04-27T14:43:41.643 回答
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
于 2012-05-04T12:55:45.103 回答