我有一个Fortran主程序,下面有很多子程序。其中一个子程序调用C++函数。该C++函数调用另一个Fortran子例程。现在我需要将它们全部编译在一起以获取输出。 我试图用icl编译C++文件。然后,我使用ifort作为Fortran文件和为C++创建的对象文件之间的链接器。但该方法不起作用。它显示无法解析的外部符号。编译Fortran和C++程序并从intel编译器链接
-2
A
回答
0
我希望你至少看到这个:https://software.intel.com/en-us/node/691954
他们所写的大多是有指C,虽然存在的C++库提。如果你与C++ ocde链接,你需要那些。 您应该阅读关于在C++中改变符号名称的信息。由于C++支持过载的功能,但链接器需要独特的符号,因此对于函数foo(int i,float j),C++生成 类似_foo****@8
而不是foo
,其中*取决于编译器和参数类型。
如果使用BIND(C),Fortran代码将生成C风格的符号,您可以强制C++为函数生成一个,方法是使用C++代码中的extern "C"
为从C++调用的fortran函数的原型以及函数从Fortran中调用。
本例使用C编译器,但对于C++,您需要更改生成的符号(https://software.intel.com/en-us/node/691929#92BDCE7A-30FA-4A60-BCDB-7CE1521572EC)。请注意,C和Fortran的互操作性不是标准化的,通常不能从一个编译器集合移植到另一个编译器集合。我不得不处理Compaq编译器修改函数名称的问题,但不是以C++方式,或者PGI Fortran需要stdcall约定。
Fortran代码实施例
subroutine Simulation(alpha, beta, gamma, delta, arrays) BIND(C)
use, intrinsic :: ISO_C_BINDING
implicit none
integer (C_LONG), value :: alpha
real (C_DOUBLE), intent(inout) :: beta
integer (C_LONG), intent(out) :: gamma
real (C_DOUBLE),dimension(*),intent(in) :: delta
type, BIND(C) :: pass
integer (C_INT) :: lenc, lenf
type (C_PTR) :: c, f
end type pass
type (pass), intent(inout) :: arrays
real (C_FLOAT), ALLOCATABLE, target, save :: eta(:)
real (C_FLOAT), pointer :: c_array(:)
...
! Associate c_array with an array allocated in C
call C_F_POINTER (arrays%c, c_array, (/arrays%lenc/))
...
! Allocate an array and make it available in C
arrays%lenf = 100
ALLOCATE (eta(arrays%lenf))
arrays%f = c_loc(eta)
...
end subroutine Simulation
C结构声明例
struct pass {int lenc, lenf; float *c, *f;};
C函数原型实施例
void simulation(long alpha, double *beta,
long *gamma, double delta[], struct pass *arrays);
C调用序列实施例
simulation(alpha, &beta, &gamma, delta, &arrays);
相关问题
- 1. 编译Fortran程序和编译器/库
- 2. 编译与intel编译器icpc在linux的C++程序
- 3. 在Linux机器上执行使用intel-fortran编译的程序
- 4. Fortran编译器
- 5. Visual Studio,Intel Visual Fortran和Visual C/C++混合语言编译
- 6. 编译和链接miracl C++
- 7. C++编译链接
- 8. 链接错误“LogonUser”编译C++程序?
- 9. 与Fortran编译器和C++库冲突
- 10. intel Fortran编译器(ifort)有编译和编译后自动运行可执行文件的选项吗?
- 11. Fortran编译器为mac读取程序
- 12. 用Intel C++编译器编译的集成DLL
- 13. C++遗传编程:调用链接器/编译器,执行编译后的程序和管道输入/输出
- 14. 使用记事本++和英特尔编译器编译文件Fortran编译器
- 15. 编译与intel编译DLL的错误
- 16. 编译和链接C++和C程序连同QT-Creator
- 17. 使用Fortran 77编译器编译Fortran IV代码
- 18. Fortran 95编译器是否可以编译Fortran 77代码?
- 19. 为iPhone编译外部C++库(Octave)(Fortran编译器缺失?)
- 20. C++编译库,并将其链接
- 21. 从java程序调用C编译器
- 22. 编译C++程序
- 23. C++程序编译
- 24. 编译mysql连接器用mingw编译C++,编译错误
- 25. 什么是Fortran编译器?
- 26. 用ISPC编译器编译OpenMP程序
- 27. C++:链接文件与GCC编译器
- 28. Borland C++编译器中的链接DLL
- 29. 在eclipse项目中编译C和fortran
- 30. 在Objective-C编译器上编译不正确的C程序
提供最小示例https://stackoverflow.com/help/mcve,从调用的Fortran C,FORTRAN或从C到获得超过只是理论建议? – Swift
你能提供更多的信息,如代码示例吗? –
我只需要知道编译过程。就像如果只有fortran子例程那么:ifort/c * .f和之后的ifort/exe:trial1 * .obj。因此,如果在C++中有子程序,那么需要修改哪个命令。 –