gfortran主要的多重定义

时间:2015-11-08 14:19:56

标签: gcc fortran gfortran gcc4

我在编写我的研究代码时遇到了麻烦。它由一个用C ++编写的组件和另一个用FORTRAN编写的组件组成。我认为问题与我的gcc版本有关。

例如,第一个文件是C ++文件(foo.ccp)

#include <iostream>
using namespace std;

extern "C" {
  extern int MAIN__();
}

int main(){
    cout << "main in C++\n";
  return MAIN__();
}

第二个是bar.f90:

program test
    implicit none
    print*, 'MAIN in FORTRAN'
end program test

我试图像这样编译它:

g++ -c foo.cpp
gfortran foo.o -lstdc++ bar.f90

它与GCC-4.4.7编译良好,但GCC-4.8.x失败,错误读数为:

/tmp/cc5xIAFq.o: In function `main':
bar.f90:(.text+0x6d): multiple definition of `main'
foo.o:foo.cpp:(.text+0x0): first defined here
foo.o: In function `main':
foo.cpp:(.text+0x14): undefined reference to `MAIN__'
collect2: error: ld returned 1 exit status

我已经读过here gfortran如何处理“主要&#39;和&#39; MAIN __&#39;自版本4.5.x以来的功能,但我不知道如何解决我的问题。

关于我缺少什么的任何想法?谢谢你的帮助!

1 个答案:

答案 0 :(得分:3)

您有两个main符号:

int main(){
    cout << "main in C++\n";
  return MAIN__();
}

program test
    implicit none
    print*, 'MAIN in FORTRAN'
end program test

program的符号为main。您无法将这两个程序链接在一起,因为两个main符号会发生冲突。您还遇到问题,因为Fortran program被赋予main符号而不是MAIN__该符号未定义。你的目标是从C ++调用Fortran,你应该这样做:

#include <iostream>

extern "C" {
  int FortMain();
}

int main()
{
    std::cout << "main in C++\n";
    return FortMain();
}

function FortMain() bind(C,name="FortMain")
   use iso_c_binding
   implicit none
   integer(c_int) :: FortMain
   print *, "FortMain"
   FortMain = 0
end function FortMain

这些将编译并链接在一起并执行您的代码尝试执行的操作。这些功能利用Fortran的iso_c_binding功能来确保Fortran功能与C完全互操作,具有适当的情况,并且没有强调有趣的业务。 Fortran函数还返回一个值,因此匹配您在示例中提供的C原型。