visual-c++ - guia - qgis manual
La creación de la aplicación Visual C++ que no utiliza funciones CRT todavía hace referencia a algunas (2)
Esto es parte de una serie de al menos dos preguntas estrechamente relacionadas, pero distintas. Espero estar haciendo lo correcto preguntándoles por separado.
Estoy intentando que mi aplicación Visual C ++ 2008 funcione sin la Biblioteca de tiempo de ejecución de C. Es una aplicación GUI de Win32 sin MFC u otras cosas sofisticadas, simplemente API de Windows.
Así que establecí Propiedades del proyecto -> Configuración -> C / C ++ -> Avanzado -> Omitir nombres de biblioteca predeterminados a Sí (compilador /Zl
) y reconstruido. Supongamos que he escrito una función de punto de entrada adecuada, que es el tema de mi otra pregunta.
Tengo dos errores de enlazador; probablemente estén relacionados. El enlazador se queja de 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 de foobar.cpp
. (Hubiera usado CopyMemory
pero resultó ser #define
d idéntico a memcpy
...)
(Pensé que podría deshacerme del problema memcpy
usando un compilador intrínseco, como #pragma intrinsic(memcpy)
, pero esto no hace diferencia).
Si miro la salida del preprocesador (agregando /P
a la línea de comandos del compilador), no veo referencias a __fltused
o _memcpy
en foobar.i
.
Entonces, mi pregunta es: ¿De dónde vienen estos errores de enlazador, y cómo los resuelvo?
Recomiendo establecer la opción de compilación "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.
__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. Puedes evitar esto simplemente declarando un símbolo con el nombre
#ifdef __cplusplus
extern "C" {
#endif
int __fltused=0;
#ifdef __cplusplus
}
#endif
WRT _memcpy - memcpy es una función __cdecl, y todas las funciones cdecl obtienen un _ automático como parte de su decoración. entonces, cuando dices "__cdecl memcpy" - el compilador y el enlazador buscan un símbolo llamado ''_memcpy''. Las funciones intrínsecas, incluso 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.