2009-10-17 13 views
5

Esto es parte de una serie de al menos dos preguntas estrechamente relacionadas pero distintas. Espero estar haciendo lo correcto preguntándoles por separado.Construir la aplicación Visual C++ que no utiliza funciones CRT todavía hace referencias a

Estoy tratando de hacer que mi aplicación Visual C++ 2008 funcione sin la C Runtime Library. Es una aplicación GUI de Win32 sin MFC u otras cosas sofisticadas, simplemente API de Windows.

Así que establezco Propiedades del proyecto -> Configuración -> C/C++ -> Avanzado -> Omitir nombres de biblioteca predeterminados a Sí (indicador del compilador /Zl) y reconstruido. Supongamos que he escrito una función de punto de entrada adecuada, que es el tema de my other question.

Recibo dos errores de enlazador; probablemente estén relacionados. El enlazador se queja de los símbolos externos no resueltos __fltused y _memcpy en foobar.obj. Huelga decir que no uso explícitamente en mi programa, pero sí uso memcpy en algún lugar en foobar.cpp. (Habría utilizado CopyMemory pero que resulta ser #define d sea idéntica a memcpy ...)

(pensé que podría deshacerse del problema memcpy mediante el uso de un compilador intrínseca, como #pragma intrinsic(memcpy), pero esto hace no hay diferencia.)

Si miro a la salida del preprocesador (añadiendo /P a la línea de comandos del compilador), no veo las referencias a tales __fltused o _memcpy en foobar.i.

Entonces, mi pregunta es: ¿De dónde vienen estos errores del enlazador, y cómo los resuelvo?

+0

Y tu pregunta es? –

+0

Ah ... debo haberlo perdido de alguna manera mientras dividía esta cosa en dos. ¡Vuelve a agregarlo, gracias! – Thomas

Respuesta

8

__fltused implica que está utilizando o ha declarado al menos algunos flotantes o dobles. El compilador inyecta este símbolo 'inútil' para provocar que un soporte flotante .obj se cargue desde el crt. Usted puede evitar esto simplemente declarando un símbolo con el nombre

#ifdef __cplusplus 
extern "C" { 
#endif 
int __fltused=0; 
#ifdef __cplusplus 
} 
#endif 

WRT _memcpy - establecimiento de memoria es una función __cdecl, y todas las funciones CDECL obtener una automática _ como parte de su decoración. entonces, cuando dice "__cdecl memcpy" - el enlazador compilador & busca un símbolo llamado '_memcpy'. Las funciones intrínsecas, incluso las solicitadas explícitamente, se pueden seguir importando si las configuraciones de compilación tienen configuraciones de depuración que contraindican las intrínsecas. Por lo tanto, necesitará implementar su propia memcpy y funciones relacionadas en algún punto de todos modos.

+0

¡Gracias por la respuesta rápida! Desafortunadamente, el truco '__fltused' parece no hacer nada por mí. Puse 'int __fltused = 0;' en la parte superior de 'foobar.cpp'; estático o no estático tampoco hace la diferencia. – Thomas

+0

Además, estoy bastante seguro de que no estoy usando flotadores o dobles en ninguna parte. Mi árbol fuente no contiene estas palabras. – Thomas

+0

Ah, envolverlo en "extern" C "' hizo el truco. ¡Gracias! – Thomas

0

Recomiendo establecer la opción del compilador "generate assembly listing" (o algo así) para foobar.cpp una vez, y luego inspeccionar el código del ensamblador. Esto realmente debería decirle dónde se usan estos símbolos.

+0

No soy exactamente un gurú ensamblador x86. Pero si logro descifrar las herramientas, podría intentarlo mañana. – Thomas

Cuestiones relacionadas