- 积分
- 17
- 注册时间
- 2008-1-22
- 仿真币
-
- 最后登录
- 1970-1-1
|
发表于 2009-6-10 13:09:16
|
显示全部楼层
|阅读模式
来自 大连理工大学西山生活区
前几天一直研究lapack软件包的安装问题,由于lapack包是Fortran写的,所以就引出了利用C语言调用Fortran函数的问题,通过网上的查找,基本解决了这个问题。下面用一个简单的例子说明一下。
我是在eclipse中用C/C++语言,eclipse是一个跨平台环境,所以和VC++有所不同。先写一个fortran.f文件,其中包含的函数是
subroutine func(a, b)
write(*,*) a, b
end
首先需要在cmd下调用gcc编译器编译这个文件,具体为 gfortran -c fortran.f ,编译后生成fortran.o文件,它是一个中间文件,需要将其生成库文件(.lib文件或是linux下的.a文件,这里设库文件为libtmp.a)具体为 ar rc libtmp.a fortran.o 。
生成库文件libtmp.a后,将其拷如掉用该fortran函数的C项目中,设该项目为MEX
其中的MEX.c文件为
#include <stdio.h>
extern void func_(float *a, float *b);
int main(int argc, char *argv[])
{
float a=1.0, b=2.0;
func_(&a, &b);
return 0;
}
这里extern是调用该外部函数。
下面就是写makefile文件,在eclipse中是CMakelists.txt中写makefile文件
下面就是所写的makefile文件:
PROJECT( MEX )
# searching route
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_BINARY_DIR}
)
SET(LIBTMP_SRC
D:/home/morphes/workspace/myprogram/engdbs/MEX
)
LINK_DIRECTORIES(
${LIBTMP_SRC}
)
SET( MEX_src
MEX.cpp
)
LINK_LIBRARIES(
libtmp.a
)
LINK_LIBRARIES(
gfortran
)
ADD_EXECUTABLE( MEX WIN32
${MEX_src}
)
其中LINK_LIBRARIES中包含该libtmp.a库文件以及gfortran编译库文件
makefile后,运行就能得出结果:
1.00000000 2.0000000
对于C++与Fortran混合编程,只需将上MEX.c中的
extern void func_(float *a, float *b);
改为 extern "C" void func_(float *a, float *b);即可。
如果直接在cmd中调用gcc编译器而不是在eclipse建项目,只需建立C文件,后调用
gcc test.c -o test.exe -L. -ltmp -lgfortran 即可
希望这些对大家有用。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
评分
-
1
查看全部评分
-
|