2012-06-08 17 views
6

Me pregunto cómo "empaquetar" un proyecto de C++ para su lanzamiento. Utiliza varias bibliotecas, y no quiero que un usuario tenga que pasar por la misma configuración que yo, con poner los archivos correctos en el lugar correcto y tal. Tuve dificultad para investigar esto, porque no estoy seguro del término técnico para este tema. Si estoy usando compilación de línea de comandos en Linux, ¿hay alguna manera fácil de hacerlo?Cómo empaquetar C++ con DLL y bibliotecas

+0

¿Está compilando DLL en Linux? – Attila

+0

Lo siento, soy estúpido, estoy haciendo desarrollo en Linux y Windows en este momento, y tuve que hacer muchas configuraciones para mis bibliotecas en ambos; Soy un principiante y probablemente estoy mezclando los dos. Tengo que enlazar en bibliotecas, lo que hice en Windows con dlls (al menos creo que eso es lo que estaba pasando allí). Estoy editando la pregunta para decir solo bibliotecas, porque no conozco las diferencias técnicas correctas entre las cosas. – akroy

+1

Hay dos versiones de bibliotecas: estática y dinámica. Las bibliotecas estáticas están vinculadas directamente con el ejecutable, por lo que no debe preocuparse por colocarlas en ningún lugar (el código es parte del ejecutable). Con las bibliotecas dinámicas, deberá asegurarse de que el tiempo de ejecución pueda encontrarlas: deberá ubicarlas en una ruta común o configurar la ruta buscada para que las bibliotecas incluyan el directorio en el que se encuentran. Lea estos [dos] (http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html) [artículos] (http://www.eyrie.org/~eagle/notes/rpath.html) para más información. – Attila

Respuesta

4

Su enfoque a esto diferirá en Windows y Linux porque cada SO maneja esto de una manera diferente. Estoy más familiarizado con Linux, así que limitaré mi respuesta al lado de Linux.

Cuando vincula su ejecutable con una biblioteca utilizando -l indicador, el vinculador se predetermina a buscar en los directorios normales de la biblioteca del sistema por lo que hay cuatro enfoques aquí.

  1. Exigen que el usuario instale correctamente las bibliotecas. Sin embargo, parece que no quieres hacer eso.

  2. Haga que el usuario agregue la ubicación de la biblioteca a la variable LD_LIBRARY_PATH.

  3. Su tercera opción es obligar al vinculador a mirar en una ruta determinada para las bibliotecas que utilizan el indicador -rpath. Por ejemplo, para que la aplicación busque en su directorio de trabajo una biblioteca compartida que puede compilar con: g++ -rpath ./ -l SomeLib -o MyApp myapp.cpp

  4. Otra opción es vincular estáticamente su código con su biblioteca de esa manera solo tiene que distribuir un ejecutable. Si existe una biblioteca estática, puede usar g++ -static -l SomeLib -o MyApp myapp.cpp para indicarle a gcc que enlace estáticamente.

+0

¿Por qué no vincularlos todos estáticamente? – vidit

+0

@vidit Supongo que incluir enlaces estáticos sería una buena idea. Edito mi publicación. Gracias por recordarme. –

+0

Los enlaces estáticos no siempre funcionan, p. cuando está usando librerías GPL pero no quiere licenciar su programa bajo GPL. – Cubic

1

¿Se refiere a un instalador?
En Windows, ¿el programa que ejecuta para instalar una nueva aplicación que excluye todo en el directorio correcto, crea el menú de inicio y le permite desinstalarlo?

Hay un constructor de instalador en Visual Studio (puede que no esté en la versión gratuita) que crea archivos de instalador .msi. Es bastante fácil de usar para tareas simples, pero se vuelve complicado hacer algo más.

Como alternativa, para crear el tipo tradicional setup.exe instala uso el libre excelente Innosetup

En Linux usted generalmente crear un paquete con el formato que usa su distribución (.deb/.rpm). Hay muchas instrucciones sobre los detalles de cada uno y las herramientas para hacerlo probablemente ya estén instaladas en su sistema Linux

2

En las ventanas que no recomiendo Wix http://wix.sourceforge.net/ para crear el instalador .msi me gustaría señalar, la ruta de búsqueda de archivos .dll que recomiendo poner todos .dll en la misma carpeta que el archivo .exe ya que este tiene la mayor prioridad

Sin embargo, el CRT vc (la/C++ biblioteca de tiempo de ejecución C) debe ser instalado usando el paquete de redistribución de Microsoft -> actualiza automáticamente http://www.microsoft.com/de-de/download/details.aspx?id=5555

Wix puede incluir el paquete de redistribución en el mismo .msi por lo tanto, solo tiene que implementar un solo archivo instalador

Cuestiones relacionadas