C/C++/Fortran混合编程浅谈------直接链接方式
来源:互联网 发布:淘宝子账号登陆错误202 编辑:程序博客网 时间:2024/04/30 04:03
文章转自PcX
现今流行很多编程语言,在编译型语言中,C/C++/Fortran语言应用非常广泛,C以其效率高效底层操作为著称,C++以其很好的面向对象类框架泛型编程为特点,Fortran则以现世存有大量的计算程序而占有重要的位置,在编程中,集合他们三者的长处是个很好的做法。混合编程有很多方法,以下介绍一下基本方法。
对于各个编译器,如果编译中间的二进制文件.o或.obj的结构相同,则可以直接链接混合编程。
遵循约定:C/C++默认传值,Fortran传址。
一、相同编译器家族
以gcc家族为例,类似的还有Intel C Compiler和Intel Fortran Compiler等。
1、C和Fortran (注意fortran和c中函数名的差异)
(1)C调用Fortran
main.c
#include <stdio.h>void sub_fortran_(int *,float *,double *);double function_fortran_(double *);int main(){ int num_int; float num_float; double num_double; double num; num_int=3; num_float=5.0; sub_fortran_(&num_int,&num_float,&num_double); num=function_fortran_(&num_double); printf("num_int=%d\nnum_float=%f\nnum_double=%f\nnum=%f",num_int,num_float,num_double,num); return 0;}sub.f90
subroutine Sub_Fortran(NumInt,NumFloat,NumDouble) implicit none integer :: NumInt real :: NumFloat real(8) :: NumDouble NumDouble=NumFloat**NumIntend subroutinereal(8) function Function_Fortran(NumDouble) implicit none real(8) :: NumDouble Function_Fortran=sqrt(NumDouble)end functionsub.f90(F2003方式)
subroutine Sub_Fortran(NumInt,NumFloat,NumDouble) use ISO_C_BINDING implicit none integer(c_int) :: NumInt real(c_float) :: NumFloat real(c_double) :: NumDouble NumDouble=NumFloat**NumIntend subroutinereal(c_double) function Function_Fortran(NumDouble) use ISO_C_BINDING implicit none real(c_double) :: NumDouble Function_Fortran=sqrt(NumDouble)end function链接方法
gcc –o main.o –c main.c
gfortran –o sub.o –c sub.f90
gcc –o main.exe main.o sub.o
或者直接 gcc –o main.exe main.c sub.f90
输出
(2)Fortran调用C
main.f90
program main implicit none interface subroutine sub_c(n1,n2,n3) integer :: n1 real :: n2 real(8) :: n3 end subroutine real(8) function func_c(n3) real(8) :: n3 end function end interface integer :: n1 real :: n2 real(8) :: n3,n4 n1=3 n2=5.0 call sub_c(n1,n2,n3) n4=func_c(n3) write(*,*) "n1=",n1 write(*,*) "n2=",n2 write(*,*) "n3=",n3 write(*,*) "n4=",n4end program
main.f90(F2003方式)program main use ISO_C_BINDING implicit none interface subroutine sub_c(n1,n2,n3) use ISO_C_BINDING integer(c_int) :: n1 real(c_float) :: n2 real(c_double) :: n3 end subroutine real(c_double) function func_c(n3) use ISO_C_BINDING real(c_double) :: n3 end function end interface integer(c_int) :: n1 real(c_float) :: n2 real(c_double) :: n3,n4 n1=3 n2=5.0 call sub_c(n1,n2,n3) n4=func_c(n3) write(*,*) "n1=",n1 write(*,*) "n2=",n2 write(*,*) "n3=",n3 write(*,*) "n4=",n4end program
sub.c
#include <math.h>void sub_c_(int *,float *,double *);double func_c_(double *);void sub_c_(int *n1,float *n2,double *n3){ *n3=pow(*n2,*n1);}double func_c_(double *n3){ double n4; n4=sqrt(*n3); return n4;}链接方式
gcc –o sub.o -c sub.c
gfortran –o main.o -c main.f90
gfortran –o main.exe main.o sub.o
或是直接
gfortran –o main.exe main.f90 sub.c
输出
作者:PcX
出处:http://www.cnblogs.com/xunxun1982/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
- C/C++/Fortran混合编程浅谈------直接链接方式
- .Net(c#) 通过 Fortran 动态链接库,实现混合编程
- FORTRAN/C/C++混合编程
- C直接调用Fortran 非链接库方式
- Fortran与C的混合编程
- windows下intel C/Fortran 混合编程
- windows下intel C/Fortran 混合编程
- FORTRAN/C/C++混合编程注意事项
- Fortran与C混合编程,C调用Fortran函数,Fortran再回调C中的函数
- 编译链接C C++ Fortran混合工程(Compiling a C/C++/Fortran mixed project)
- Fortran与C语言混合编程中的文件处理
- 【混合编程实例】C/C++调用FORTRAN编写的DLL
- Fortran与C混合编程(转自Ubuntu)
- C语言和Fortran混合编程结构体传递参数
- C和Fortran混合编译初步
- Fortran与C/C++的混合开发
- 链接指示: extern "C" C和C++混合编程问题
- C++与fortran混合编程时的链接问题(ZZ)
- POJ - 3311 Hie with the Pie (状态压缩)
- FFT 快速傅里叶变换 初探
- linux c获取IP地址
- Cocos2d-x action动作整理集合
- 异步编程:When.js快速上手
- C/C++/Fortran混合编程浅谈------直接链接方式
- linux系统中python导入其他的目录下的文件
- AP算法java实现
- 利用freemarker 静态化网页
- #22 Generate Parentheses
- HDU 1180 诡异的楼梯
- strcpy()函数编译报错
- unity 序列化在IOS真机上抛出异常
- [LeetCode]Longest Substring Without Repeating Characters