找回密码
 注册
Simdroid-非首页
查看: 130|回复: 1

[2. C/C++/C#] eclipse中的C与Fortran混合编程(原创)

[复制链接]
发表于 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

查看全部评分

发表于 2009-6-12 21:37:31 | 显示全部楼层 来自 大连理工大学
Simdroid开发平台
不错啊 很快就要用到
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-1 13:31 , Processed in 0.042190 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表