所以我跟着这个例子 http://difdop.polytechnique.fr/wiki/index.php/How_to_Bessel_Functions_in_C
除了我正在尝试使用英特尔编译器ICL和IFORT而不是gcc和g77。
我在C ++中的代码是:
extern "C" void zbesj_(double*, double*, double*, int*, int*, double*, double*, int*, int*);
typedef std::complex<double> CplxDbl;
CplxDbl besselj(double nu, CplxDbl z)
{
int kode=1;
int n=1;
double zr=z.real();
double zi=z.imag();
int nz,ierr;
double cyr[1],cyi[1];
CplxDbl res;
zbesj_(&zr,&zi,&nu,&kode,&n,cyr,cyi,&nz,&ierr);
if(ierr!=0){
printf("error!\n");
}
return CplxDbl(cyr[0],cyi[0]);
}
int _tmain(int argc, _TCHAR* argv[])
{
CplxDbl J0=besselj(0.0,CplxDbl(0.1,0.2));
printf("\nJ0(0.1+0.2i)= %.17f %+.17f I\n",J0.real(),J0.imag());
return 0;
}
此外,我有zbesj.f及其所有依赖项。我先尝试过调用ICL,然后调用IFORT,反之亦然。不编译:(
icl -c CallFortranFromC.cpp
ifort -o test CallFortranFromC.obj *.f
总是以相同的链接器错误结束:
CallFortranFromC.obj : error LNK2019: unresolved external symbol zbesj_ referenced in function main
test.exe : fatal error LNK1120: 1 unresolved externals
感谢任何帮助!
答案 0 :(得分:0)
链接阶段中的符号名称不匹配。如果你这样做:
dumpbin /SYMBOLS zbesj.obj
您会在目标文件中看到符号名称为大写,并且没有尾随的UNDERSCORE。
最容易解决的问题是(假设您不想更改C代码):
icl -c CallFortranFromC.cpp
ifort /names:lowercase /assume:underscore -o test CallFortranFromC.obj *.f