Pregunta

Al desarrollar e implementar aplicaciones de Windows nativas, a menudo necesito instalar un tiempo de ejecución antes de poder ejecutar mi binario o vincular estáticamente la biblioteca con mi binario. Por ejemplo, después de construir un proyecto de "consola Win32" con Visual Studio 2008, intentando ejecutar el programa en una nueva imagen de Windows 7 da como resultado:

La aplicación no ha podido comenzar porque su configuración de lado a lado es incorrecta. Consulte el registro de eventos de la aplicación o use la herramienta de línea de comandos sxstrace.exe para obtener más detalles.

Problemas como este se han mencionado en otras publicaciones en Stackoverflow.

¿Cómo se desarrolla aplicaciones que no ¿Requiere tiempos de ejecución que aún no están en el sistema operativo objetivo (es decir, no requieren la instalación de paquetes redistribuibles o conjuntos privados/compartidos de lado a lado)? ¿Cómo se evita usar MSVC [MPR] 90.DLL y simplemente use la API de Windows en Windows System32*. {Dll, SYS}?

Estoy pensando en la línea del código que sale del grupo de grupo, pero con frecuencia no está disponible.

¿Fue útil?

Solución

Otros ya han respondido con respecto a la vinculación de CRT estáticamente. Si también desea un pequeño binario al mismo tiempo, entonces su mejor apuesta es antes de CRT por completo, y use solo las funciones de API Win32 tanto como sea posible. Todavía obtendrá un código CRT, sobre todo relacionado con el inicio (es decir, lo que llama main) y apagado (atexit Manejo, etc.), pero de lo contrario el enlazador no vinculará las funciones CRT que no usa.

Puede evitar vincular CRT por completo usando /Zl interruptor del compilador. Esto significa que main Sin embargo, ya no funcionará: deberá definir WinMain (El nombre no importa, pero la firma debe coincidir, y debe ser __stdcall), y tendrá que especificar el nombre de su WinMain-El función similar a un punto de entrada a través de enlazador /entry: cambiar. Esto le ahorrará ~ 30 kb de código CRT (probado en un .cpp con un vacío main).

Si sigue la última ruta, es posible que también tenga que lidiar con el tema de la intrínseca del compilador. Hay algunas funciones que están definidas nominalmente por el CRT (y se declaran en sus encabezados), pero que el compilador tratan especialmente por el compilador, de modo que inserta instrucciones de ensamblaje optimizadas en el punto de la llamada donde sea posible, los ejemplos son memset, strlen, y una buena parte de las funciones en <math.h>; Se puede encontrar una lista completa aquí. Dado que no tiene CRT, si necesita estas funciones, o podría evitarlo, pero prefiere la intrínseca debido a un mejor rendimiento (difícil de hacer mejor que memset, por ejemplo), entonces tienes que declararlos tú mismo y usar #pragma intrinsic. P.ej:

// Contains macros and typedef only, so safe to include without CRT.
// We need it here for size_t.
#include <stddef.h> 

extern "C"
{
    int abs(int);
    void* memset(void*, int, size_t); 
}

#pragma intrinsic(abs, memset)

int __stdcall main(void*, void*, char*, int)
{
    char tmp[10];
    memset(tmp, abs(-123), 10);
    return 0;
}

Lo anterior se puede compilar con:

cl /c /Zl foo.cpp
link /entry:main foo.obj

Otros consejos

Enlace el CRT estáticamente a través del /MT Cambie (y de la misma manera MFC, si lo está usando).

La vinculación estática limita lo que puede hacer con DLLS de alguna manera, pero para ejecutables simples funciona como un encanto. (Y si está enviando DLL, siempre puede enviar asambleas privadas de todos modos).

Use el CRT estático. Esto no crea una dependencia de MSVC*.dll. El CRT está vinculado directamente a su programa. Esto no crea dependencias, pero aumenta el tamaño de su ejecutable.

Más información sobre diferentes opciones de CRT aquí.

Enlace estáticamente el tiempo de ejecución. MS Visual C ++ tiene opción /mt para eso (predeterminado es /md)

Creo que una forma de hacer esto es no usar Visual Studio y, en su lugar, confiar en las herramientas SDK de la línea de comandos. (Alternativamente, puede descubrir cómo configurar VS para hacer lo que desea, pero eso parece más difícil). Por ejemplo,:

cl /c app.cpp
link app.obj ws2_32.lib
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top