Hola a todos, un placer conocer estos foros
Soy un principiante en la programación en C y sobre todo en Visual Studio. Tengo casi un mundo de dudas y os estaría muy agradecido si me las pudierais aclarar.
Estoy aprendiendo C++ y quiero hacer un programa que utilice la librería libcurl para descargar y subir archivos desde un servidor web a mi ordenador, para ello estoy usando VS2008 profesional SP1 con el Windows SDK 6.1. También uso el compilador gcc de MinGW para compilar las librerías que me dan problemas con el Visual Studio.
Pues veréis, ya se que me puedo bajar los binarios precompilados para usarlos con mi programa, incluso se de la existencia de wrappers a C++ que me pueden hacer la vida más fácil a la hora de programar, pero me gustaría compilarlo todo yo mismo desde el principio para aprender todo lo posible durante el proceso.
Me gustaría compilar libcurl con soporte para zlib y ssl, y para ello se que además de ActivePerl, necesito las librerías: zlib, openssl-fips, libssh y curl.
Perdonadme si lo describo todo con excesivo detalle, pero me gustaría plantearlo todo bien desde el principio y poder usar este mismo post para plantear las futuras dudas que seguramente me vayan surgiendo en los próximos días.
Ahora permitirme que os describa brevemente los pasos que estoy siguiendo desde el principio y que os cuente mis primeras dudas.
Paso 1: Compilar zlibPara esta compilación he optado por usar Visual Studio, ya que en la carpeta
projects se incluye un proyecto para VS6 y no me he encontrado con problemas para convertirlo a un proyecto de VS8.
El administrador de configuraciones viene con varias plantillas predefinidas, y exactamente en este punto llegan mis primeras dudas.
Lo lógico sería usar las plantillas que generan parte del código en assembler, como
DLL ASM Release y
LIB ASM Release, ya que así ganaremos velocidad de ejecución. Pero puestos a elegir entre una librería estática (LIB ASM) y una dinámica (DLL ASM), ¿cual me recomendáis?
Según tengo entendido, no es aconsejable mezclar en un mismo programa librerías estáticas y dinámicas. Y es mejor que todas las librerías que vayamos a compilar de forma dinámica sean
thread-safe, y según he visto en la página oficial de zlib, esta librería sí que lo es.
No entiendo muy bien los motivos de este requisito, pero entiendo que si tan solo una de las dependencias de libcurl no fuera thread-safe, debería compilar todas ellas de forma estática, y por lo visto todas las librerías implicadas en el proceso sí que son seguras, corregidme si me equivoco.
También creo que siempre que sea posible, es recomendable usar librerías dinámicas ya que así el futuro mantenimiento de la aplicación se hace mucho más sencillo y rápido, además de que a la hora de realizar actualizaciones del programa, la distribución de este ocupa menos, ya que no tendremos que incluir las dependencias adicionales a no ser que también las actualicemos claro.
Os estoy contando todo esto sin conocimiento de causa. Es la poca teórica que he aprendido pero que todavía no he tenido ocasión de aplicar, así que corregidme si me equivoco por favor
Además de las ventajas ya indicadas de las librerías dinámicas, ¿existen otras? Rendimiento por ejemplo, ¿es más eficiente la una sobre la otra?
A continuación paso al tema de los switches.
¿Existe un consenso sobre cuáles son los switches que compilan con el mejor rendimiento para la release de bibliotecas dinámicas, como en el caso de zlib y el resto de dependencias de libcurl?
Yo la verdad es que estoy un poco perdido con tanto switch. ¿Se pueden usar los mismos ya sea una aplicación de C, C++ o librería?
De momento he probado a compilar con los switches que indico más abajo y no he tenido problema, aunque desconozco si se puede optimizar para un rendimiento todavía más elevado, o bien si hay algunos que sean incompatibles entre sí o tal vez excluyentes unos de otros.
/O2 /Ob1 /Oi /Ot /D "WIN32" /D "_WINDOWS" /D "NDEBUG" /D "_VC80_UPGRADE=0x0600" /D "ASMV" /D "ASMINF" /D "_CRT_SECURE_NO_WARNINGS" /D "_WINDLL" /GF /FD /EHsc /MD /GS- /Gy /arch:SSE2 /Fp".Win32_DLL_ASM_Release/zlib.pch" /Fo".Win32_DLL_ASM_Release/" /Fd".Win32_DLL_ASM_Release/" /W3 /nologo /c /TC /errorReport:prompt
Y para terminar, la última pregunta de hoy
Si se usan un determinado conjunto de switches para una dependencia de una determinada librería, ¿se ha de usar también la misma configuración para el resto de ellas?
Eso es todo, perdonadme si me he extendido demasiado pero es que cuando uno empieza son tantas las dudas que le salen que es casi imposible avanzar sin que alguien te explique las cosas con un lenguaje más cercano.
Otro día continuaré con el
Paso 2: Compilar openSSL, que también tengo unas cuantas dudas y no os quiero atosigar.
Un saludo