|
|
从网上找了例子,想从IDL中实现调用Fortran(subalign.f)的功能
调用过程需要用到一个C函数align.c.这两个源文件在下面.
1.首先编译这两个源文件;
2.然后创建共享库;
3.IDL调用(略去)
1.Makefile文件如下
subalign.so : align.o subalign.o
subalign.o : subalign.f
f77 -o32 -c subalign.f -lm -lc
align.o : align.c
cc -o32 -c align.c
clean:
rm -f *.o align subalign so_locations *.so
但make时出现问题
cc -o32 -c align.c
f77 -o32 -c subalign.f -lm -lc
f77: -lfrtbegin: linker input file unused because linking not done
f77: -lg2c: linker input file unused because linking not done
f77: -lm: linker input file unused because linking not done
f77: -lc: linker input file unused because linking not done
刚刚开始接触make
不知道该怎么解决上述问题??
多谢
2. Create shared libraries
cc -o32 -shared -all subalign.o align.o -o subalign.so
---------------------------------------------------------------------
FORTRAN子过程subalign.f
SUBROUTINE subalign(XP, Y1, Y2, Y3, Y4, Y5, JMAX, EX, DEX)
DIMENSION Y1(JMAX),Y2(JMAX),Y3(JMAX),Y4(JMAX),Y5(JMAX),XP(JMAX)
DO 15 J=1,JMAX
X1=EX
X2=EX/2.
X3=EX/3.
X4=EX/4.
X5=EX/5.
Y1(J)=X1*(2.+X1)/(1.+X1)**2
Y2(J)=X2*(2.+X2)/(1.+X2)**2
Y3(J)=X3*(2.+X3)/(1.+X3)**2
Y4(J)=X4*(2.+X4)/(1.+X4)**2
Y5(J)=X5*(2.+X5)/(1.+X5)**2
XP(J)=EX
15 EX=EX+DEX
RETURN
END
---------------------------------------------------------------------
C函数align.c
#include <stdio.h>
void subalign(int argc, void *argv[])
{
extern void subalign_(); /* Fortran routine */
float *xp, *y1, *y2, *y3, *y4, *y5, *ex, *dex;
int *jmax;
xp = (float *) argv[0]; /* Array pointer */
y1 = (float *) argv[1]; /* Array pointer */
y2 = (float *) argv[2]; /* Array pointer */
y3 = (float *) argv[3]; /* Array pointer */
y4 = (float *) argv[4]; /* Array pointer */
y5 = (float *) argv[5]; /* Array pointer */
/* Do the calculations in Fortran */
subalign_(xp, y1, y2, y3, y4, y5, jmax, ex, dex);
} |
|