stampede上编译c和fortran混编程序multiple definition of `main'问题解决

今天在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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值