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
.
轻松获得它
这对我有用。适合你吗?
我想为我的 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
.
这对我有用。适合你吗?