gfortran多重定义main

4

我在编译一段与我的研究相关的代码时遇到了困难。它由一个用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

我在这里读到,自4.5.x版本以来,gfortran处理'main'和'MAIN__'函数的命名方式发生了变化,但我不确定如何解决我的问题。
有什么想法吗?感谢您的帮助!

1
你只能有一个主函数。你想在Fortran还是C中? - Ross
1个回答

3
你有两个主要符号:main
int main(){
    cout << "main in C++\n";
  return MAIN__();
}

并且

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

主要的程序使用符号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原型匹配。


是的,这个方法行得通。我按照建议用一个函数替换了我的FORTRAN程序。谢谢! - user2982871

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接