2010-03-21 10 views
15

No estoy hablando de hacer código portátil. Esto es más una cuestión de distribución. Tengo un proyecto de tamaño mediano. Tiene varias dependencias en bibliotecas comunes (por ejemplo, openssl, zlib, etc.). Compila bien en mi máquina y ahora es el momento de dársela al mundo.Consejos sobre cómo implementar código C++ para trabajar en todas partes

Ingeniería de construcción esencial en su máxima expresión. Quiero hacer instaladores para Windows, Linux, MacOSX, etc. Quiero crear una bola de alquitrán descargable que haga que el código funcione con ./configure y make (probablemente a través de autoconf). Sería la guinda del pastel tener una opción de hacer que construya los instaladores ... incluso puede ser una compilación cruzada para que un instalador de Windows pueda construirse en Linux.

¿Cuál es la mejor estrategia? ¿Dónde puedo esperar pasar la mayor parte del tiempo? ¿El enfoque principal debe ser autoconf o hay otras herramientas que pueden ayudar?

+1

Puede considerar utilizar un sistema de compilación multiplataforma como CMake. –

Respuesta

14

Recomendaría CMake. Ventajas:

  • Es muy fácil de usar para construir proyectos simples y complejos con bibliotecas estáticas, bibliotecas dinámicas, ejecutables y sus dependencias.
  • Es independiente de la plataforma y genera archivos makefiles y/o proyectos ide para la mayoría de los compiladores e IDE.
  • Resume las diferencias entre Windows y Unix, por ejemplo, "libShared.so" y "Shared.dll" se conocen como "Compartidas" (cmake maneja las diferencias de nombres para cada plataforma), si Shared es parte de su proyecto, clasifica la dependencia si no asume que está en la ruta del enlazador.
  • Investiga el sistema de usuarios para el compilador y bibliotecas de terceros que son necesarios, luego puede eliminar componentes cuando las bibliotecas de terceros no están disponibles o mostrar un mensaje de error (se envía con macros para encontrar las bibliotecas de terceros más comunes).
  • Se puede ejecutar desde la línea de comandos o con una interfaz gráfica de usuario sencilla que permite al usuario cambiar cualquiera de los parámetros que se descubrieron anteriormente (por ejemplo, compilador o versión de una biblioteca de terceros).
  • Admite macros para automatizar pasos comunes.
  • Hay un componente llamado CPack que le permite crear un instalador, creo que esto es solo una cosa de línea de comandos make install (no lo he usado).
  • El componente CTest se integra con otras bibliotecas de pruebas de unidades como la prueba de refuerzo o la prueba de google.

Uso CMake para todo ahora, incluso para proyectos de prueba simples con visual studio.

Nunca he usado autotools pero muchos otros usuarios han comentado que cmake es más fácil de usar. El proyecto de KDE se movió a cmake desde autotools por este motivo.

+1

+1. Muchas bibliotecas/aplicaciones de SO grandes usan CMake, por lo que parece ser bastante útil. Heckalot mejor que autoconf/automake si también quieres descargarlo en Windows. – Macke

3

El producto en el que trabajo no es muy diferente de esto. Usamos un sistema de compilación basado en autoconf, y funciona bastante bien.

El lugar donde pasará la mayor parte del tiempo, de lejos, es apoyar a los usuarios. Los sistemas de los usuarios tendrán todo tipo de arrugas que no espera hasta que las encuentre, y deberá agregar más opciones de configuración para admitirlas. Con el tiempo, hemos agregado opciones para establecer las rutas de inclusión y lib para cada biblioteca de la que dependemos; hemos agregado opciones para cambiar los indicadores de compilación para solucionar varios errores técnicos extraños en varias versiones de esas bibliotecas (o cambios de API de una versión a otra que necesitan cambios en nuestro código), hemos agregado soluciones para el hecho de que algunas bibliotecas BLAS usa una interfaz C y algunos utilizan una interfaz Fortran, por lo que, aunque teóricamente son implementaciones de la misma biblioteca, hacen algunas cosas de forma ligeramente diferente, y así sucesivamente. No puede prever todo esto por adelantado, y también necesita documentación para que los usuarios puedan determinar qué opciones establecer.

Ah, y los instaladores son realmente un problema, porque generalmente dependen del sistema operativo (a menos que sea solo un script de shell y requiera CygWin), y las ubicaciones para instalar tienden a depender del sistema operativo, y así sucesivamente. Esa es otra área que tomará tiempo, ya sea en la construcción de un buen instalador, o en el apoyo a los usuarios para configurar manualmente las cosas.

Configurar la compilación cruzada es, en mi experiencia, bien valer la pena (al menos para el caso de Linux a Windows, no estoy seguro de MacOS/X) - mucho más fácil que tratar de mantener múltiples sistemas de compilación diferentes en sintonía.

Como perspectiva alternativa, existe la opción que el proyecto OpenFOAM utiliza para su biblioteca C++ bastante grande, que es distribuirla junto con un compilador G ++ "aprobado" y paquetes para todos los demás componentes, para que no lo hagan Tengo que preocuparme por diferentes compiladores, etc. Pero eso realmente solo funciona en un sistema operativo. Supongo que la versión de Windows/MacOSX de eso es para proporcionar imágenes VMWare preconfiguradas. En algunos casos, hay algo que decir acerca de eso ....

0

Use autotools, la mayoría de los usuarios están familiarizados con ellos (es decir, que saben ejecutar ./configure & & & & hacer make install)

  • Crea .tar.gz con make dist, pruébalo para asegurarse de que se compila y funciona en más de un sistema.
  • Para Linux/Unix/Cygwin, no proporcione instaladores ... fuente tar.gz es más que bien. En cualquier caso, cada distribución de Linux tiene sus propias reglas de empaquetado y la mayoría de ellos sabe usar compilaciones autoconf, los usuarios pueden tener sistemas de 32 o 64 bits o incluso ejecutar PPC o Sparc, así que no se moleste.

    Tal vez vale para crear una deb o rpm para los sistemas más populares, pero no más que eso ..

  • Para Windows (nativo, no cygwin) proporcionar binarios. La instalación de Migw + auto es bastante dolorosa y los usuarios de Windows generalmente son más "siguiente-> siguiente-> siguiente" usuarios luego "wget ​​/ tar/configure/make/make-install" usuarios "Proporcionan zip o algún instalador hay algunos instaladores de FOSS por ahí.

    Recuerde que los usuarios pobres de Windows por defecto no tienen zlib o openssl ... por lo que usted necesita enviar con su paquete.

Sobre CMake ...

Si se dirige principalmente a la plataforma Windows o si está dispuesto a admitir MSVC, entonces probablemente deba considerarlo. De lo contrario, las herramientas automáticas proporcionan una buena distribución y una alternativa de compilación.

Cuestiones relacionadas