Esta es una pregunta anterior, pero tengo una nueva solución que no es necesario modificar math.h.
me encontré con un problema similar cuando traté de enlace estática 'msvcrt-ruby18-static.lib' en mi propia DLL en Visual Studio 2012 (VS2012). Tengo el siguiente error:
'unresolved external symbol __imp__hypot referenced in function _math_hypot'
Gracias a la respuesta de Matt, sabemos que es causada por el cambio de 'math.h'.
Esta función:
double hypot(double _X, double _Y)
antes de VS2010 que era una función de exportación DLL declarado por palabra clave como esto:
extern "C" __declspec(dllexport) double __cdecl hypot(...)
desde VS2010, se convirtió en una función en línea:
static __inline double __CRTDECL hypot(...)
Afortunadamente en VS2012, la función en línea está envuelta por una macro RC_INVOK ED.Puede probar este implantación de dominio público para dejarlo enlace:
#define RC_INVOKED
#include <ruby.h>
extern "C" __declspec(dllexport)
double hypot(double x, double y)
{
if (x < 0) x = -x;
if (y < 0) y = -y;
if (x < y) {
double tmp = x;
x = y; y = tmp;
}
if (y == 0.0) return x;
y /= x;
return x * sqrt(1.0+y*y);
}
[AVISO] Mi proyecto es una DLL y utilizo la palabra clave dllexport directamente. Parece que el prefijo '__ imp __' no se puede definir directamente. Traté de definir una función llamada __ imp __hypot (...) y fallé.
El proyecto está configurado en multiproceso, sí. – zaratustra
Y ruby18-mt-static-release.lib probablemente quiera MT-static, no la versión MT-DLL del CRT. – user566408