main 的 gfortran 多重定义

gfortran multiple definition of main

我在编译为我的研究提供的一段代码时遇到了问题。它由一个用 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 自版本 4 以来,gfortran 如何处理 'main' 和 'MAIN__' 函数的命名发生了变化。5.x 但我不确定如何解决我的问题。

关于我遗漏了什么有什么想法吗?感谢您的帮助!

您有两个 main 个符号:

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

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

主要 program 的符号为 main。你不能 link 这两个程序在一起,因为两个 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

这些将与 link 一起编译并执行您的代码试图执行的操作。这些利用 Fortran 的 iso_c_binding 特性来确保 Fortran 函数在正确大小写的情况下与 C 完全互操作,并且没有强调有趣的事情。 Fortran 函数还 returns 一个值,因此与您在示例中提供的 C 原型相匹配。