上次写了GNU的一套编译器做C和fortran的混合编译问题,这次因为机器编译环境的问题,用了intel的编译器(icc/ifort/icc编译的mpi),使用C语言的主程序调用fortran的函数,同样的方法会遇到链接的问题:
multiple definition of `main':
/opt/intel/……/lib/intel64/for_main.c: first defined here
为什么连接器会认为有两个main?那个for_main是哪里蹦出来的呢?
根据intel论坛上的解释(software.intel.com/en-us/forums/showthread.php?t=43720),for_main是一个fortran的runtime中的内容,当你用一个C语言的主程序调用fortran的函数,显然是不需要这个for_main的“壳”的。
解决方法是在链接参数中加入:
-nofor_main
知道原理了这个看起来就很简单。包括C和fortran混编的其他问题,如果了解编译和链接的原理,会查看符号表,一些古怪的trick也很容易理解,这篇里就不细写了。