ошибки компоновщика — возникли проблемы при подключении C ++ к Fortran с использованием ICL / IFORT

Так что я следую примеру от
http://difdop.polytechnique.fr/wiki/index.php/How_to_Bessel_Functions_in_C

За исключением того, что я пытаюсь использовать компиляторы Intel 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

Решение

У вас есть несоответствие в именах символов на этапе ссылки. Если вы делаете:

dumpbin  /SYMBOLS zbesj.obj

Вы увидите, что имя символа в объектном файле — UPPER CASE и не имеет завершающего UNDERSCORE.

Самое простое решение — это (при условии, что вы не хотите менять код C):

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]