Si el código compilado por un compilador visual de C++ es C++ directo, ¿por qué necesita un paquete redistribuible? ¿Esto hace que su plataforma de código sea dependiente? ¿El uso del compilador visual de C++ con el paquete redistribuible proporciona alguna ventaja sobre el uso de otro IDE junto con g ++?¿Por qué se requiere el paquete redistribuible de Visual C++?
Respuesta
El código no depende de la plataforma, el resultante es ejecutable. Está vinculado a las bibliotecas MS con la implementación estándar de la biblioteca, que se incluyen en la redistribuible como DLL.
IIRC debería haber una opción para la vinculación estática de todo, de modo que no necesitaría la redistribución adicional, pero el binario resultante seguiría dependiendo de la plataforma; por ejemplo, no puede ejecutar un binario de Windows en un UNIX sistema (sin WINE al menos).
Tiene la opción de incluir el administrador de memoria, la biblioteca de E/S estándar y, por ejemplo, una copia separada en cada aplicación, sin una buena forma de administrarlo y actualizarlo y toneladas de distorsión, o para instalar una única ejecución. tiempo que contiene todo ese código una vez para cada aplicación que pueda necesitarlo. –
@DavidSchwartz, sí ... Y creo que está incluido por defecto en todas las instalaciones de Windows, ¿verdad? – littleadv
Depende de qué instalación de Windows y qué tiempo de ejecución. Una nueva instalación de Windows Vista SP1, por ejemplo (si alguien todavía instala eso) no tendrá el tiempo de ejecución VS2010. –
No existe tal cosa como "Straight C++". Siempre habrá algunas funciones de la biblioteca a las que llamará aquí y allá en su código, e incluso si tiene mucho cuidado de no hacerlo, habrá algunas funciones que deberán ser llamadas simplemente por el código emitido por el compilador. Por ejemplo, si tiene el siguiente ciclo:
for(int i = 0; i < count; i++)
array1[i] = array2[i];
El compilador lo reemplazará con un código que simplemente copie la memoria. Y si está compilando para un tamaño más pequeño en lugar de velocidad, esta será una llamada a una función muy similar a memmove().
Además, es posible que tenga algunas operaciones de punto flotante para las cuales no existen instrucciones equivalentes directas de x86; estos también se implementarán con llamadas a funciones. Y la lista continúa.
Esto no hace que la plataforma de su código dependa, porque en una plataforma diferente, el compilador de ese plafrom compilará el mismo código suyo para ir con lo que sea el tiempo de ejecución de C++ para esa plataforma.
Afortunadamente, el tiempo de ejecución de C++ no tiene que ser una entidad separada de la aplicación. Comprueba tus opciones de compilador y enlazador; deberías poder producir un único ejecutable que contenga ambos. Si ha encontrado que g ++ no requiere un tiempo de ejecución por separado, es porque hace exactamente eso por defecto.
El C redistribuible ++ son específicos para el IDE que está utilizando ("IDE" digo, pero eso es muy específica para el compilador, sin embargo, el compilador IDE & son a la vez que se asignaron nuevas versiones como las cosas se mueven a lo largo.)
Está hecho específicamente para ese IDE, pero no para el sistema operativo Win. Por lo tanto, debe ser compatible con versiones anteriores (suponiendo que no esté utilizando nuevas API, obviamente). En realidad, esto se hace para que sea compatible con versiones anteriores (y no al revés, como está pensando). Esto le permite usar la última versión la mejor versión IDE (10, 11, 12 ...) y aún ejecuta su código en Win2k!
Ahora, por supuesto, es muy diferente de Linux, donde se espera que recompile en cada versión principal de todos modos. La mayoría de los sistemas Unix funcionarán de esa manera.
No conozco una forma de compilar C++ estáticamente para poder evitar esos redistribuibles. Es posible, aunque ciertamente haría tu .exe muy grande.
Guardo siempre una copia de Visual C++ 6 instalado en una máquina virtual xp (no funcionará correctamente en Win 6/7/8). A veces escribo o me piden que escriba una aplicación de utilidad para hacer algo rápido y/o una vez que compilo como un solo exe.Me cansé de enviar un programa simple escrito usando solo la biblioteca estándar a otra persona solo para que me digan que no funciona debido a la falta de dll o paquete redistribuible.
En las Propiedades del proyecto, C/C++, Generación de código establezca la biblioteca de tiempo de ejecución en/MT para la versión de lanzamiento.
(Créditos a Mike daneses que respondieron a esta pregunta en social.msdn: https://social.msdn.microsoft.com/Forums/vstudio/en-US/09afd4be-7a15-4772-98c1-a0464a96cd7f/how-to-static-linkage-in-visual-c-express-edition-2010?forum=vcgeneral&prof=required)
- 1. Dónde descargar Microsoft Visual C++ 2003 redistribuible
- 2. Implementar Qt con MinGW requiere VC++ redistribuible?
- 3. ¿Cuál es la diferencia entre un paquete redistribuible visual c de Microsoft y un paquete de tiempo de ejecución?
- 4. ¿Qué paquete redistribuible de VC++ se debe elegir (x86 o x64)?
- 5. ¿Por qué C# requiere parens en condicionales?
- 6. ¿Por qué se requiere copy_to/from_user?
- 7. ¿Por qué se requiere un vector?
- 8. ¿Por qué se requiere $ root aquí?
- 9. ¿Por qué algunos lenguajes de Microsoft se llaman "visuales"? (Visual C#, Visual Basic .NET, Visual C++)
- 10. ¿Por qué Scanf requiere &?
- 11. ¿Por qué C no tiene paquete privado?
- 12. ¿Por qué ofstream requiere una descarga?
- 13. ¿Por qué sendTextMessage requiere el permiso READ_PHONE_STATE?
- 14. ¿Por qué Android requiere que el nombre del paquete tenga al menos dos identificadores?
- 15. ¿Por qué el argumento del tipo de mapa C++ requiere un constructor vacío cuando se usa []?
- 16. Se requiere Oracle sqlldr TRAILING NULLCOLS, pero ¿por qué?
- 17. Por qué se queja Visual C++ 6 en destructor privado
- 18. ¿Por qué PreparedStatement.setNull requiere sqlType?
- 19. El símbolo global requiere el nombre explícito del paquete
- 20. por qué autoimport solo el paquete java.lang?
- 21. ¿Por qué mi proyecto de Visual Studio Win32 requiere la instalación de .NET 3.5 SP1?
- 22. ¿Por qué se requiere sid en 'KILL SESSION' (Oracle SQL)?
- 23. por qué tomcat no requiere reiniciar cuando se cambia jsp
- 24. ¿Por qué el compilador requiere `delete [] p` versus` delete p [] `?
- 25. ¿Por qué no se requiere un molde para el puntero a pesar de que malloc lo requiere?
- 26. ¿Se requiere app.config en proyectos de .NET 4.0 C#?
- 27. ¿Por qué # se requiere antes #include <stdio.h>?
- 28. ¿Por qué Visual Studio se cuelga constantemente?
- 29. Ejecutando binarios en C++ sin el tiempo de ejecución redistribuible (Server2k3, XPSP3)
- 30. ¿Por qué se requiere un molde para la resta de bytes en C#?
código compilado es siempre * * dependiente de la plataforma. Funciona en, y solo en, la plataforma para la que fue compilado. –
No es obligatorio. Debería crear un proyecto de instalación en su lugar. O compila con/MT en lugar de/MD para que no lo necesites en absoluto. Arriesgado sin embargo cuando usas DLL. –