2011-07-24 12 views
5

Estoy intentando volver a compilar mi viejo juego que une la librería Ruby, pero me siguen dando este error:símbolo externo sin resolver "_hypot" al utilizar biblioteca estática

ruby18-mt-static-release.lib(math.obj): error LNK2001: unresolved external symbol _hypot

¿Hay alguna solución para esto que doesn ¿Me requieren encontrar el código fuente de esta biblioteca y reconstruirla?

Estoy usando Visual Studio 2010 y el último DirectX SDK.

Respuesta

4

Tuve un problema similar. Al parecer, hipot era una función enlazable, pero ahora (tengo VS 2010) es una función en línea que llama a _hypot. En math.h, esta es la única función en la que se hace esto. No tengo una fuente para la biblioteca existente que estoy usando y tiene un enlace hipotético para que no pueda usar la versión en línea. Si solo defino la hipótesis yo mismo, el vinculador dice que ya está definida. Los siguientes trabajos para corregir esto:

  • Editar math.h y comentar o ifdef la versión en línea de hypot.
  • Implementar hypot como extern "C" doble hypot (doble x, doble y) {return _hypot (x, y);}
  • Relink

feo, pero resuelto el problema.

1

Está utilizando la versión MT-STATIC de la biblioteca. Debe asegurarse de que su proyecto (Generación de código-> Biblioteca de tiempo de ejecución) también esté configurado en DLL multiproceso, no multiproceso. Por el contrario, puede encontrar la versión MT-DLL de la biblioteca. De cualquier manera, la biblioteca de tiempo de ejecución (MT o MTD) debe ser coherente en todo su programa y en todas las bibliotecas que desee vincular.

http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspx

+0

El proyecto está configurado en multiproceso, sí. – zaratustra

+0

Y ruby18-mt-static-release.lib probablemente quiera MT-static, no la versión MT-DLL del CRT. – user566408

0

Implementar hypot() mismo. Es bastante sencillo:

double hypot(double x, double y) { 
    double ax = fabs(x), ay = fabs(y); 
    double xy = x/y, yx = y/x; 
    return ax > ay 
     ? ax * sqrt(1.0 + yx*yx) 
     : ay * sqrt(1.0 + xy*xy); 
} 
+0

error C2084: función 'double hypot (double, double)' ya tiene un cuerpo – zaratustra

+0

intente nombrarlo _hypot() en su lugar – Ferruccio

+0

Mismo error "no resuelto". – zaratustra

1

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é.

Cuestiones relacionadas