我想从F77主程序调用C ++函数。我已经在主程序中定义了:
DOUBLE PRECISION FC34F, bf_Fc34F
然后打个电话
FC34F = bf_Fc34F( temp )
函数bf_Fc34F是* .C文件中的C函数,并定义为
double bf_Fc34F_( double T ){
T="some_mathematical_expression";
return T;
}
我正在使用g ++ / gfortran,并且在编译* .C文件(g ++ -c * .C)时,*。o文件具有结尾的“ _d”(我认为是“ double”),这是主程序执行的没有,因此我收到“未定义的引用”错误。
有谁知道如何克服这个问题?
最佳答案
您需要从Fortran和C ++方面处理互操作性-主要是名称处理-
从C ++使用extern "C"
从Fortran定义到函数的显式接口,该函数指定bind(C)
并使用可互操作的类型
C ++代码:
#include<iostream>
using namespace std;
extern "C" {
double bf_Fc34F( double T ){
T=T*T;
cout << " from c++ - T: " << T << endl;
return T;
}
}
Fortran代码:
program fc34f_test
double precision FC34F
interface
function bf_Fc34F(T) bind(C,name="bf_Fc34F")
use iso_c_binding
real(C_DOUBLE) :: bf_Fc34F
real(C_DOUBLE), value :: T
end function
endinterface
FC34F = bf_Fc34F(2.d0)
print*,"from Fortran - FC34F: ", FC34F
end program fc34f_test
编译:
g++ -c fun.C ; gfortran -c main.f90 ; g++ fun.o main.o -o exe -lgfortran
执行:
./exe
关于c++ - F77和C++混合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43927334/