使用ICL / IFORT将C ++链接到Fortran时遇到问题

时间:2014-03-14 15:20:46

标签: c++ linker-errors intel-fortran

所以我跟着这个例子 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

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

链接阶段中的符号名称不匹配。如果你这样做:

dumpbin  /SYMBOLS zbesj.obj

您会在目标文件中看到符号名称为大写,并且没有尾随的UNDERSCORE。

最容易解决的问题是(假设您不想更改C代码):

icl -c CallFortranFromC.cpp
ifort  /names:lowercase /assume:underscore  -o test CallFortranFromC.obj *.f