anf*_*fho -1 c c++ fortran fortran77 fortran-iso-c-binding
我想从F77主程序中调用C++函数.我已在主程序中定义:
DOUBLE PRECISION FC34F, bf_Fc34F
Run Code Online (Sandbox Code Playgroud)
并打个电话
FC34F = bf_Fc34F( temp )
Run Code Online (Sandbox Code Playgroud)
函数bf_Fc34F是*.C文件中的C函数,定义为
double bf_Fc34F_( double T ){
T="some_mathematical_expression";
return T;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用g ++/gfortran,当编译*.C文件(g ++ -c*.C)时,*.o文件附加了一个尾随的"_d"(我认为是"双"),主程序执行没有,因此我得到一个"未定义的引用"错误.
有谁知道如何克服这个问题?
小智 5
您需要处理Fortran和C++方面的互操作性 - 主要是名称修改:
extern "C"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;
}
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
编译:
g++ -c fun.C ; gfortran -c main.f90 ; g++ fun.o main.o -o exe -lgfortran
执行:
./exe