我在编写我的研究代码时遇到了麻烦。它由一个用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以来的功能,但我不知道如何解决我的问题。
关于我缺少什么的任何想法?谢谢你的帮助!
答案 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原型。