2011-11-07 17 views
5

Tengo una pregunta sobre cómo se relacionan las constantes definidas en math.h._HUGE y __IMP__HUGE en "math.h"

En visual studio 2010, estoy construyendo una biblioteca dll C++ de 64 bits con "MD" que usa una biblioteca de terceros que hace uso de "HUGE_VAL". Desde el encabezado "math.h", parece que "HUGE_VAL" se define como "_HUGE". Cuando trato de instalar, da como resultado un error de vinculación

error LNK2001: sin resolver símbolo _HUGE externa

Después de hacer algunas google, creo _HUGE deberían definirse en msvcrt.lib. MSVCRT.lib está vinculado, pero no vinculé libcmt.lib porque podría causar errores de redefinición.

Lo que me parece extraño es que cuando creo un programa de consola simple que utiliza HUGE_VAL y el uso/prolijo como una opción enlazador, muestra _ IMP _HUGE siendo vinculado.

Lo que realmente me llama la atención es en qué etapa se convierte _HUGE en _ IMP _HUGE? Además, ¿alguien más ha obtenido el error _HUGE no resuelto y alguien tiene alguna idea de cómo podría solucionarse?

Gracias por leer la pregunta larga y por cualquier idea.

+0

No sé nada sobre Visual Studio (solo estoy usando GCC en Linux) pero HUGE_VAL es estándar. ¿Quizás necesites pedirle a tu compilador que siga estrictamente un nuevo estándar? –

+2

Está mezclando archivos .obj/.lib compilados con/MT. No puede mezclar, todo el código vinculado necesita usar la misma configuración. –

Respuesta

2

He tenido este problema con VC11.0. El único error que recibo es un error _HUGE de símbolo no resuelto.

Estoy vinculando con bibliotecas de tiempo de ejecución de múltiples hilos dinámicos y encontré que si tuviera que incluir "libcmt.lib" en mi paso de enlace, entonces el problema se resolvió (o se solucionó).

Comencé a buscar cómo se definieron los encabezados en el SDK en busca de pistas y encontré que me faltaba un pre-directorio del compilador en mis pasos de compilación: _DLL.

Cuando compila con bibliotecas de tiempo de ejecución dinámicas, la variable _HUGE debe ser __declspec (dllimport) para que pueda encontrarla. Cuando incluye "math.h" -> "crtdefs.h" sin configurar _DLL como una directiva previa, la variable no será __declspec (dllimport) y aparecerá como perdida en el tiempo del enlace.

Estaba obteniendo este problema porque estoy compilando con mis propios archivos make y no había agregado la directiva previa _DLL. Agregar -D_DLL a mi paso de compilación resolvió el problema de compilación sin necesidad de otros cambios.

Sé que este hilo es viejo, pero pensé que lo tiraría, ya que puede ayudar a alguien con un problema similar.

Cuestiones relacionadas