我的Fortran代码需要调用名为SolveBIE_()的C ++函数,并且此函数写在一个文件中,例如test.c. SolveBIE_()需要调用其他文件中编写的其他一些C ++函数,例如: part01.c,part02.c。我还在part01.h和part02.h中声明了这些函数。然后我用
$ gcc -c part01.c
$ gcc -c part02.c
$ ar cr kf.a part01.o part02.o part01.h part02.h
得到我的kf.a.我在我的fortran编译中将kf.a链接为目标文件。我正在使用intel fortran ifort和makefile。我的制作中出错了。这是makefile脚本。
FC = ifort
IFC_OPT = -O3 -ipo -unroll
FFLAGS = -extend_source -mp1 -xW -w95 -cm $(IFC_OPT) -cm
LINKFLAGS = -LFFTPACK -ldfftpack
CC = cc
HS_OBJECTS = xx.o kf.a ...\ objectfile
VEL = vel_new_massflux.o matvec.o
MAIN = xx.o new_restart.o
hsflux_objs = $(MAIN) $(VEL) $(HS_OBJECTS)
hsflux: $(hsflux_objs)
$(FC) -o hsflux $(FFLAGS) $(hsflux_objs) $(LINKFLAGS)
hsfluxd_objs = driver_massflux_debug.o $(VEL) $(HS_OBJECTS)
hsflux_debug: $(hsfluxd_objs)
$(FC) -o hsflux_debug $(FFLAGS) $(hsfluxd_objs) $(LINKFLAGS)
$(FC) $(FFLAGS) -o testfft2 testfft2.o FAST.o xfft.o $(LINKFLAGS)
.f.o:
$(FC) -c $(FFLAGS) $*.f
.c.o:
$(CC) -c $*.c
clean:
/bin/rm -f *.o *~
VISCFING_FILES=Makefile *.f *.F *.c *.h FFTPACK Scripts PARAMS
错误是
ipo: warning #11021: unresolved SolverBIE_
Referenced in /tmp/ipo_ifortUqyTSb.o
/tmp/ipo_ifortUqyTSb.o: In function 'MAIN_':
ipo_out.f:(.text+0x5442): undefined reference to 'SolveBIE_'
C ++代码和Fortran代码的细节在这里,我问的另一个问题,似乎问题已经解决了。但我需要完成编译以确保。 C++ code and fortran code
答案 0 :(得分:0)
回到你的linked code,Fortran已经
了 integer (C_INT) function SolveBIE_(x, y, aa, m) BIND(C, NAME='SolveBIE_')
而C有
int solveBIE_(double *ini_bdry_x, double *ini_bdry_y, double *ini_bdry_um, int *fM)
Fortran部分因此寻找名为SolveBIE_
的符号,而C部分则提供名为solveBIE_
的符号。每个角色的区别都很重要!