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 原型相匹配。
我在编译为我的研究提供的一段代码时遇到了问题。它由一个用 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 原型相匹配。