今天在stampede上编译一个程序时,发生了错误:
<span style="background-color: rgb(240, 240, 240);">login4.stampede(24)$ mpif90 -o testInterfaceC testInterfaceC.o -L../../seism_io_interface-v0.2/lib -lseism_io -L../../C-IO-LIBS-v0/c_mpiio_LIB -lclib_mpi -L../../F-IO-LIBS-v0.2/mpiio_LIB -lforlib_mpi -lm -ldl -lz -lgfortran -lmpich</span>
testInterfaceC.o: In function `main':
/seismio/seismIO-141015/seism_io_interface-v0.2/testInterfaceC/testInterface7X.c:27: multiple definition of `main'
/opt/apps/intel/15/composer_xe_2015.2.164/compiler/lib/intel64/for_main.o:/export/users/nbtester/labserverprocess/efi2linux_classicISS_15_0_20150122_010000_1073743773/20150122_010000/libdev/frtl/src/libfor/for_main.c:(.text+0x0): first defined here
/opt/apps/intel/15/composer_xe_2015.2.164/compiler/lib/intel64/for_main.o: In function `main':
/export/users/nbtester/labserverprocess/efi2linux_classicISS_15_0_20150122_010000_1073743773/20150122_010000/libdev/frtl/src/libfor/for_main.c:(.text+0x2a): undefined reference to `MAIN__'
/usr/bin/ld: link errors found, deleting executable `testInterfaceC'
先介绍一下,这个程序和使用库的情况。
1.这个程序是用C写的。
2.seismIO是使用Fortran和C混合编写的基于MPIIO的一个并行IO库。
因此,最后链接的时候应该是使用mpif90来完成。
该程序在本地编译运行并没有什么问题,根据提示信息可以看到是main()函数multiple definition。
后来在google的帮助下找到了解决方案。
就是应该使用-nofor-main或-nofor_main参数,原文在这里(https://software.intel.com/en-us/node/579609),意思是如果程序不是用Fortran写的那么就要指出来。那么为什么在本地编译没有什么问题呢?我想应该是本地使用了GNU mpif90而stampede上使用是的intel mpif90吧。
正确的用法是这样的:
login4.stampede(24)$ mpif90 -nofor-main -o testInterfaceC testInterfaceC.o -L../../seism_io_interface-v0.2/lib -lseism_io -L../../C-IO-LIBS-v0/c_mpiio_LIB -lclib_mpi -L../../F-IO-LIBS-v0.2/mpiio_LIB -lforlib_mpi -lm -ldl -lz -lgfortran -lmpich
其他编译器参数:
显示所有警告信息
gfortran -Wall
ifort -warn all -diag-disable