【问题标题】:undefined reference to 'SolveBIE_' when binding C++ and Fortran绑定 C++ 和 Fortran 时未定义对“SolveBIE_”的引用
【发布时间】:2018-02-08 23:47:55
【问题描述】:

我的 Fortran 代码需要调用名为 SolveBIE_() 的 C++ 函数,该函数写在一个文件中,例如测试.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

【问题讨论】:

  • 另外,如果 SolveBIE__ 函数位于名为 test.c 的文件中,那么它可能不是 C++,而只是 C。导出 C++ 代码(例如成员函数)并从 C++ 外部调用它们比 C 函数(名称修饰、vtables 等)更难。
  • 感谢您的评论。该页面几乎没有用。我还没有看到问题的解决方案。

标签: c++ intel-fortran


【解决方案1】:

回到你的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_ 的符号。每个字符大小写的区别很重要!

【讨论】:

  • 在这个论坛上,我观察到您每次正确回答发布的问题时都会被否决。感谢投反对票的人对我的回答充满信心。
  • 错误消失了。但我还有其他一些错误。它几乎与未定义的引用有关。有没有关于如何进行混合语言编译的教程?
  • 当您说错误消失时,您的意思是您修复了 Fortran 代码或 C++ 代码,以便双方就函数名称达成一致? Fortran 有一种自动方式来确保当您调用另一个程序时,双方通过模块在接口上达成一致。 C 通过头文件实现了同样的功能,但是没有一种自动的方法可以在不同的语言中正确实现。在 Fortran 中,您使用 C 互操作性功能,在 C++ 中将所有内容声明为 extern "C",但您必须确保正确,尤其是间接级别。
猜你喜欢
  • 2016-06-14
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多