Так что я следую примеру от
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
Любая помощь приветствуется!
У вас есть несоответствие в именах символов на этапе ссылки. Если вы делаете:
dumpbin /SYMBOLS zbesj.obj
Вы увидите, что имя символа в объектном файле — UPPER CASE и не имеет завершающего UNDERSCORE.
Самое простое решение — это (при условии, что вы не хотите менять код C):
icl -c CallFortranFromC.cpp
ifort /names:lowercase /assume:underscore -o test CallFortranFromC.obj *.f
Других решений пока нет …