绑定C ++和Fortran时未定义引用'SolveBIE_'

时间:2018-02-08 23:47:56

标签: c++ intel-fortran

我的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

1 个答案:

答案 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_的符号。每个角色的区别都很重要!