FORTRAN 代码与 MPI 的静态链接

Static linking of an FORTRAN code with MPI

我想为我的 Fortran 代码构建一个独立的 bainary(静态链接),这样它就不再使用任何共享库。 该程序使用 mpi,所以我需要所有连接的库。 我开始生成自己的库包:

ar rc my_lib.a /opt/intel/impi/4.1.0.030/intel64/lib/* /opt/intel/composerxe/mpirt/lib/intel64/*

接着编译我的文件:

ifort -c -I/home/.../Remote/mpif.h -L/home/../Remote/my_lib.a file1.f
ifort -c -I/home/.../Remote/mpif.h -L/home/.../Remote/my_lib.a file1.f

ifort -O3 -o dns zufall.o dnspipe.o my_lib.a

但这返回了以下错误消息:

ld: dns: hidden symbol `stat' in /usr/lib/x86_64-linux-gnu/libc_nonshared.a(stat.oS) is referenced by DSO
ld: final link failed: Bad value

我该如何解决?

备注一:@Gilles 我现在试过了,它有效:

mpiifort -c zufall.f
mpiifort -c dnspipe.f

ifort -o dns zufall.o dnspipe.o -L/opt/intel/impi/4.1.0.030/intel64/lib -Wl,-non_shared,-lmpigf,-lmpi,-lmpigi,-call_shared

ldd dns 输出比是:

linux-vdso.so.1 =>  (0x00007fff6ace6000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f557a6f9000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f557a4dd000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f557a151000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f5579f3b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f5579d37000)
/lib64/ld-linux-x86-64.so.2 (0x00007f557a993000)

现在这是静态的吗?

我没有相同版本的英特尔 MPI,所以我无法在此处测试我的解决方案。但是,经过一些评论后,情况仍然如此:

  • 拥有完全静态的二进制文件可能不是一个好主意,尤其是涉及到 libc 时...但是在完全同构的集群上,为什么不呢。
  • 通常,只需使用 mpiifort -static 即可。然而,经验表明这种情况很少发生,因为在静态库等中到处都缺少一些随机函数。
  • 如果只有部分库是您想要静态链接的库,那么有一个解决方案。例如,如果这是您想要静态的 Intel 库,则 -intel-static 链接选项应该会起作用。但不幸的是,大多数时候它并没有像宣传的那样工作,特别是对于 MPI 库。

所以让我们假设您想要的是至少将 MPI 库打包到您的二进制文件中。所以这就是我的做法:

> mpiifort -c hello_mpi.f90
> ifort -o hello_mpi hello_mpi.o -L$INTEL_MPI_PATH/intel64/lib -Wl,-non_shared,-lmpigf,-lmpi,-lmpigi,-call_shared

我猜要包含的库列表将取决于您使用的 MPI 库的版本,但您可以使用 mpiifort -show.

轻松获得它

这对我有用。适合你吗?