我想构建一个我的fortran代码的独立bainary(静态链接),以便它不再使用任何共享库。 该程序使用mpi所以我需要所有连接的库。 我开始生成自己的libary包:
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
我该如何解决?
备注1:@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)
这现在是静态的吗?
答案 0 :(得分:0)
我没有相同版本的英特尔MPI,所以我无法在此测试我的解决方案。但是,在几句话之后,这是怎么回事:
mpiifort -static
即可。但是,经验表明,这种情况很少发生,因为静态库中存在一些随机函数,等等。-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
轻松获取它。
这对我有用。它适合你吗?