2010-09-10 19 views
31

No soy nuevo en C++ aunque soy nuevo en Linux. Estoy usando CMake para precompilar un motor de juego multiplataforma con un tercero, pero tengo muchas dudas sobre el uso de las bibliotecas. Mi pregunta es cómo trabajar con bibliotecas de terceros. Y dónde poner estas libs. Apt instala libs en su lugar oficial (/ usr/local,/usr/lib/..) pero yo desarrollo en Windows utilizando libs locales que están en una carpeta en mi directorio de proyecto.¿Dónde colocar bibliotecas de terceros para configurar un entorno de desarrollo de C++ linux?

Además, necesito un buen tutorial para conocer las reglas sobre cómo funcionan las bibliotecas. por ejemplo: al intentar compilar mi proyecto, luabind pregunta por liblua.s0.1, pero AFAIK no hay forma de generar esta biblioteca con la fuente proporcionada por lua (al menos haciendo make, make install).

Lo sé, esta pregunta es confusa pero no tengo suficiente experiencia para ser más conciso.

actualización: Después de leer las respuestas de Sombe, una pregunta más concisa es la siguiente. Si instalo todas las bibliotecas de terceros, ¿cómo puedo distribuir mi programa? ¿Cómo administrar las dependencias sin utilizar un archivo Léame grande?

Gracias por todo el texto fuerte

+0

La biblioteca LUA sería 'liblua.so.1', no' liblua.s0.1'. –

Respuesta

47

Dónde poner las bibliotecas

La mejor solución es utilizar sistema de paquetes de su distribución de Linux (apt-get, yum, o similar) para instalar las bibliotecas de paquetes de distribuciones proporcionada siempre que sea posible.

Si las bibliotecas empaquetadas de la distribución no son de una versión reciente, o si necesita algunas opciones de construcción no estándar, o si necesita una biblioteca que su distro no proporciona, puede compilarla e instalarla usted mismo. Usted tiene dos opciones principales para dónde poner la biblioteca:

  • /usr/local (bibliotecas bajo /usr/local/lib, encabezados bajo /usr/local/include). Esto instala las bibliotecas en todo el sistema y es probablemente la solución más simple, ya que entonces debería poder compilar contra ellas sin tomar ningún paso adicional. NO instale bibliotecas directamente en /usr, ya que interferirán con el sistema de empaquetado de su distribución.
  • En su directorio de proyectos, como lo hizo en Windows. Esto tiene la ventaja de no requerir acceso raíz y no realizar cambios en todo el sistema, pero deberá actualizar los caminos de inclusión y las rutas de biblioteca de su proyecto, y deberá colocar los archivos de biblioteca compartida en algún lugar donde el dynamic linker pueda encontrarlos (usando LD_LIBRARY_PATH o ld.so.conf - vea el enlace para más detalles).

Cómo funcionan las bibliotecas excelente Programming Library HOWTO

Véase David A. Wheeler. Recomiendo leer eso y luego publicar preguntas específicas como nuevos temas.

Cómo distribuir su programa

Tradicionalmente, los programas de Unix/Linux no incluyen copias de sus dependencias. En su lugar, depende del usuario final o del desarrollador instalar esas dependencias. Esto puede requerir una "gran README", como usted ha dicho, pero tiene algunas ventajas:

Bibliotecas de desarrollo
  • se pueden instalar, administrados y actualizados a través del gestor de paquetes de la distribución, en lugar de cada copia de origen que tiene su propio conjunto de bibliotecas para rastrear.
  • Solo hay una copia de una biblioteca determinada en un sistema, por lo que solo hay un lugar que debe actualizarse si, por ejemplo, se encuentra una falla de seguridad. (Por ejemplo, considere el caos que resultó cuando zlib, una biblioteca de compresión muy utilizada, tenía un security flaw, por lo que todas las aplicaciones que incluían una versión afectada debían actualizarse)
  • Si su programa es lo suficientemente popular (y es de código abierto o al menos libremente disponible), entonces los mantenedores de paquetes para varias distribuciones de Linux pueden querer incluirlo en su distribución. Los mantenedores de paquetes realmente no les gustan las bibliotecas integradas. Ver, por ejemplo, Fedora's page on the topic.

Si va a distribuir su programa a los usuarios finales, es posible que desee considerar ofrecer un paquete (.dpkg o .rpm) que simplemente podrían descargar e instalar sin tener que utilizar la fuente.Idealmente, desde la perspectiva del usuario final, el paquete se agregaría a los repositorios de distros (si es de código abierto o al menos libremente disponible) para que los usuarios puedan descargarlo usando sus administradores de paquetes (apt-get o yum). Todo esto puede complicarse, debido a la gran cantidad de distribuciones de Linux que existen, pero un compatible con Debian/Ubuntu .dpkg y un compatible con Red Hat/CentOS/Fedora .rpm debe cubrir un buen porcentaje de usuarios finales. La creación de paquetes no es demasiado difícil, y hay buenos consejos en línea.

+1

Me gusta '/ opt' y stow – Anycorn

+0

¡Gran punto de partida! Estoy tratando de hacer lo mismo que en Windows. Quiero decir: si tienes una instalación de Clena VC++ puedes compilar mi proyecto porque todas las bibliotecas están juntas. En Linux, quiero lo mismo. Leeré cómo hacerlo. ¡¡¡Muchas gracias!!! – Killrazor

+1

Para situaciones normales en las que todo el mundo estoy de acuerdo/usr/local/X pero cuando estoy trabajando con bibliotecas que estoy creando y depurando (mucho) para mí (incluso si soy el único que usa el sistema) ponerlos en ~/local/X –

1

bien, así que esta es una de las cuestiones básicas y mientras yo mismo podría no encontrarse muy claro en esto, aquí va:

  1. Mientras que la construcción de una proyecto, su compilador tendrá que encontrar los archivos de encabezado de las bibliotecas. Los encabezados deben estar en la ruta de inclusión.
  2. Después de que la compilación haya finalizado, el enlazador buscará los archivos binarios de la biblioteca (archivos.so o algo así). Estos deben estar en la ruta de la Biblioteca.

Eso es lo básico.

Si tiene algunas librerías específicas, puede agregarlas a sus propios directorios de proyecto lib/ y include/ y agregarlas a la ruta de inclusión y la ruta de la biblioteca, respectivamente.

Agregar estos directorios a estas rutas se puede hacer de muchas maneras, dependiendo de cómo esté construyendo el proyecto. Estoy seguro de que hay algo llamado LD_PATH involucrado en todo esto ... Pero realmente no sé los detalles relacionados con CMake.

Un poco de google puede ayudarlo a hacer lo anterior con CMake.

Espero que ayude,
JRH

+0

Para mí, poner libs en/usr/include es como agregar directorios en opciones de rutas globales en VC++. En todos mis programas, coloco todas las bibliotecas de terceros en la carpeta de proyectos, luego configuro el proyecto (muy fácil en VC++). Más adelante, si necesito distribuir mi proyecto, basta tener una instalación limpia de VC++ y hacer un check-out del repositorio para compilar mi proyecto. Al menos en Windows. Es solo esto lo que estoy buscando. – Killrazor

1

Si va a instalar las bibliotecas con un gestor de paquetes, es probable que todos terminan en el lugar correcto. De lo contrario, puede obtener el compilador para buscar proporcionando una ruta de búsqueda adicional utilizando el indicador -L <path>. Debería poder pasar esta bandera extra a CMake.

Por cierto, el -I <path> se puede utilizar para agregar un directorio adicional para buscar archivos incluidos.

1

para la primera parte de su pregunta con respecto a Windows: no existe un lugar estándar para bibliotecas/encabezados en Windows, por lo que la solución más fácil es: crear la suya propia. Simplemente proporcione una sola lib/e incluya/en su sistema y haga que todos sus proyectos lo usen (configurando la ruta en un archivo cmake que incluya en todas partes). Poner todos librerias de terceros en ese país, por ejemplo:

sus proyectos:

d:/projects/projectA 
d:/projects/projectB 

tercer materia de la fiesta:

d:/api/lib/lua.lib 
d:/api/include/lua/.... 

(incluso se puede utilizar enlaces simbólicos alias 'uniones de directorio' si tiene versión diferente)

y el archivo correspondiente cmake:

include_directories(d:/api/include) 
link_directories(d:/api/lib) 
Cuestiones relacionadas