C直接调用Fortran 非链接库方式
2013-11-16 09:18
260 查看
C与Fortran都是应用广泛的语言,由于二者语言特性的不同,应用的场合很有差异。C语言通常用于系统软件和一些应用软件的开发,而Fortran在高性能应用领域有很好的应用。对于通常的用户,接促C语言的较多,但是,C语言的开发者,有时还想利用高效的Fortran 数据包 或者是Fortran语言的开发者想借用C提供的强大辅助功能,为此,为了方便大家对二语言相互调用的学习。这里给出了一些简单的入门性技术介绍。
编译与执行
NOTES; if you use the gcc tool, it will generate error
#gcc -o main main.c add.o
add.o: In function `add_’:
add.f95:(.text+0x4c): undefined reference to `_gfortran_st_write’
add.f95:(.text+0x69): undefined reference to `_gfortran_transfer_real’
add.f95:(.text+0x87): undefined reference to `_gfortran_transfer_character’
add.f95:(.text+0xa4): undefined reference to `_gfortran_transfer_real’
add.f95:(.text+0xc2): undefined reference to `_gfortran_transfer_character’
add.f95:(.text+0xdf): undefined reference to `_gfortran_transfer_real’
add.f95:(.text+0xed): undefined reference to `_gfortran_st_write_done’
collect2: ld returned 1 exit status
Some Wrong with your PATH for you gcc library
OK! you are clever and has known how call fortran routines in the C progaram. Next part I show you how to call C routines in the Fortran program!
使用CodeBlocks编译时,需要在LINKER选项中加入-lgfortran 编译选项,否则也会出现如上错误。
附:CodeBlocks工程文件
编译源代码
1.C调用Fortran
编辑Fortran源文件 add.f95subroutine add(a, b, c) implicit none real:: a, b, c c = a + b write(*,*) a, '+', b, '=', c return end subroutine add编译 add.f95
f95 -o add.o -c add.f95编辑C 主程序main.c
#include <stdio.h> extern void add_(float *a, float *b, float *c); int main(int argc, char *argvs[]) { float a, b, c; a = 5.0; b = 7.0; add_(&a, &b, &c); return 0; }声明你要调用的函数,这里注意,是add_,调用的时候用指针,即变量地址,你应该明白了Fortran的调用是改变参数值的。
编译与执行
#gfortran -o main main.c add.o #./main
NOTES; if you use the gcc tool, it will generate error
#gcc -o main main.c add.o
add.o: In function `add_’:
add.f95:(.text+0x4c): undefined reference to `_gfortran_st_write’
add.f95:(.text+0x69): undefined reference to `_gfortran_transfer_real’
add.f95:(.text+0x87): undefined reference to `_gfortran_transfer_character’
add.f95:(.text+0xa4): undefined reference to `_gfortran_transfer_real’
add.f95:(.text+0xc2): undefined reference to `_gfortran_transfer_character’
add.f95:(.text+0xdf): undefined reference to `_gfortran_transfer_real’
add.f95:(.text+0xed): undefined reference to `_gfortran_st_write_done’
collect2: ld returned 1 exit status
Some Wrong with your PATH for you gcc library
OK! you are clever and has known how call fortran routines in the C progaram. Next part I show you how to call C routines in the Fortran program!
使用CodeBlocks编译时,需要在LINKER选项中加入-lgfortran 编译选项,否则也会出现如上错误。
附:CodeBlocks工程文件
2.Fortran调用C函数
编辑C源码add.c#include <stdio.h> void add_(float *a, float *b, float *c) { *c = *a + *b; printf("%f + %f = %f\n", *a, *b, *c); }Notes The funtion name "add_"
编译源代码
# gcc -o add.o -c add.c编辑fortran 主程序main.f95,编译和执行
PROGRAM MAIN implicit none real:: i, j, k ! ! The first fortran program ! i = 5.0 j = 8.0 call add(i, j, k) stop end program MAINNOTE 9 line
# gfortran -o main main.f95 add.o (or f95 -o main main.f95 add.o) # ./main 5.000000 + 8.000000 = 13.000000OK. If you reach here, congratulations, you have learned how to call routines between C and fortran!
相关文章推荐
- C/C++/Fortran混合编程浅谈(一)直接链接方式
- C/C++/Fortran混合编程浅谈------直接链接方式
- C++调用Fortran程序----动态链接方式
- C++调用Fortran程序----动态链接方式
- VB调用WebService(直接Post方式)并解析返回的XML
- C#调用Fortran的动态链接库的注意事项
- ios开发,javascript直接调用oc代码而非通过改变url回调方式
- ios中javascript直接调用oc代码而非通过改变url回调方式(转)
- dlopen 方式调用 Linux 的动态链接库
- 【OpenGL】用OpenGL shader实现将YUV(YUV420,YV12)转RGB-(直接调用GPU实现,纯硬件方式,效率高)
- ios开发,javascript直接调用oc代码而非通过改变url回调方式
- IE中点击链接下载EXCEL文件直接以乱码方式打开解决
- 以命令行的方式调用Windows的动态链接库
- Java链接Oracle数据库时候调用含有游标的存储过程(两种不同处理方式)
- 通过对象或者类名直接调用方法的方式区别
- Java调用Delphi DLL(通过C++调用和直接调用两种方式)
- Python调用C/Fortran混合的动态链接库--上篇
- lua入门之三:lua调用c/c++库(动态链接方式)
- WebService接口直接http调用方式
- 在程序中调用C++链接库中的回调函由于没有考虑生命周期,直接写委托回随机的被gc给回收掉导致报这个错误