2009-05-01 24 views
5

¿Es posible usar archivos de objetos compartidos de manera portátil como DLL en Windows?¿Objetos compartidos portátiles?

Me pregunto si hay alguna manera de que pueda proporcionar una biblioteca compilada, lista para usar, para Linux. Del mismo modo que puede compilar una DLL en Windows y puede usarse en cualquier otro Windows (vale, no CUALQUIER OTRO, pero en la mayoría de ellos puede).

¿Es eso posible en Linux?

EDIT:
he acaba de despertar y leer las respuestas. Hay algunos muy buenos.
No estoy tratando de ocultar el código fuente. Solo quiero proporcionar una biblioteca ya compilada y lista para usar, por lo que los usuarios sin experiencia en compilación no necesitan hacerlo ellos mismos.
Por lo tanto, la idea es proporcionar un archivo .so que funcione en tantos Linuxes como sea posible.
La biblioteca está escrita en C++, utilizando las bibliotecas STL y Boost.

+0

¿Está dispuesto a liberar el código fuente de su biblioteca también? ¿La biblioteca compilada es solo una utilidad adicional además del código fuente que está liberando? – pts

+0

El código no es necesario. El OP solo necesita un desinterruptor, mira mi respuesta. –

Respuesta

10

I altamentealtamente recomendamos utilizar la aplicación LSB/comprobador de la biblioteca. Su va a decir rápidamente si:

  • está utilizando extensiones que no están disponibles en algunas distribuciones
  • introducir Bash-ismos en las secuencias de comandos de instalación
  • Use syscalls que no están disponibles en todos los recientes granos
  • depende de bibliotecas no estándar (que le dirá lo que les falta distribuciones)
  • Y un montón, sobre un montón de otros muy buenos controles

Puede obtener more information here y descargar la herramienta. Es fácil de ejecutar ... simplemente destrabarlo, ejecutar un script de Perl y apuntar a su navegador en localhost ... el resto es impulsado por el navegador.

Utilizando la herramienta, puede obtener fácilmente su biblioteca/aplicación LSB certificada (para ambas versiones) y hacer que el trabajo del distribuidor de distribución sea mucho más fácil.

Más allá de eso, solo use algo como libtool (o similar) para asegurarse de que su biblioteca esté instalada correctamente, proporcione un objeto estático para las personas que no desean vincularlo con el DSO (le tomará tiempo a su biblioteca aparece en la mayoría de las distribuciones, por lo que escribir un programa portátil, no puedo contar con que esté presente) y comentar bien su interfaz pública.

Para las bibliotecas, creo que Doxygen funciona mejor. La documentación es muy importante, sin duda influye en mi elección de biblioteca para usar en cualquier tarea.

Realmente, de nuevo, mira el comprobador de aplicaciones, va a darte informes de problemas de portabilidad que tomarían un año de tener la biblioteca en la naturaleza para obtener lo contrario.

Finalmente, intente hacer que su biblioteca sea fácil de colocar 'en el árbol', para que no tenga que enlazar estáticamente con ella. Como dije, podría tomar un par de años antes de que se vuelva común en la mayoría de las distribuciones. Es mucho más fácil para mí simplemente agarrar tu código, soltarlo en src/lib y usarlo, hasta que tu biblioteca sea común. Y por favor, por favor ... denme pruebas unitarias, TAP (pruebe cualquier protocolo) es una forma buena y portátil de hacerlo.Si pirateé su biblioteca, necesito saber (rápidamente) si la rompí, especialmente al modificarla en árbol o en situ (si existe DSO).

+0

LSB información ya no está disponible. –

0

Simplemente poniendo un archivo .so en/usr/lib puede funcionar, pero es probable que estropee el esquema que tiene su distribución para gestionar bibliotecas.

Eche un vistazo a la base estándar de Linux: es lo más parecido que encontrará a una plataforma común entre las distribuciones de Linux.

http://www.linuxfoundation.org/collaborate/workgroups/lsb

¿Qué estás tratando de lograr?

+0

Bueno, existe la conveniencia de no tener que publicar la fuente, y también la molestia de compilar. – Unknown

2

Entonces, la pregunta es, ¿cómo desarrollar bibliotecas compartidas para Linux? Puede echar un vistazo a this tutorial o the Pogram Library Howto.

+0

no, él no es. él está preguntando cómo eliminar/evitar la dependencia de la versión estática en SO. – Francis

2

Sé lo que estás preguntando. Para Windows, MSFT ha hecho que los archivos DLL sean todos compatibles, por lo que sus archivos DLL suelen ser compatibles con casi todas las versiones de Windows, por eso lo llama "portátil".

Desafortunadamente, en Linux hay demasiadas variaciones (y todos piensan que es "diferente" para ganar dinero) para que no pueda obtener los mismos beneficios que Windows, y es por eso que tenemos muchos paquetes iguales compilados para diferentes distribuciones , versión de distribución, tipo de CPU, ...

Algunos dicen que el problema es causado por la arquitectura (CPU), pero no lo es. Incluso en el mismo arco, aún hay diferencias entre las distribuciones. Una vez que haya intentado liberar un paquete binario, sabrá cuánto es difícil, incluso la dependencia de la biblioteca C runtime es difícil de mantener. El sistema operativo Linux carece de muchas cosas, por lo que casi todos los servicios implican un problema de dependencia.

Por lo general, solo puedes construir algunos archivos binarios que sean compatibles con alguna distribución (o, varias distribuciones si tienes suerte). Es por eso que liberar programas de Linux en binario siempre está mal, a menos que esté ligado a alguna distribución como Ubuntu, Debian o RH.

+1

Esta es una actitud un poco derrotista. Linux admite una variedad más amplia de arquitecturas que Windows, no vas a poder evitar eso. Pero dentro de una única arquitectura, las distribuciones son casi totalmente compatibles con binarios, siempre que no tenga dependencias en otras bibliotecas o ejecutables, etc. en el sistema. – MarkR

+1

Aparentemente no has visto el mundo real y tienes la idea de por qué y cómo lo hicieron. Si alguna vez ha trabajado en la compañía de software de Linux, lo sabrá. – Francis

4

Si desea ayudar a sus usuarios proporcionándoles código compilado, la mejor manera que conozco es darles una documentación binaria estáticamente vinculada sobre cómo pueden ejecutar el código binario. (Esto posiblemente sea adicional a darles el código fuente.) La mayoría de los binarios enlazados estáticos funcionan en la mayoría de las distribuciones Linux de la misma arquitectura (los binarios enlazados estáticamente +32 bit (x86) funcionan en 64 bits (amd64)). No es de extrañar que Skype proporcione una descarga de Linux enlazada estáticamente.

Volver a la pregunta de la biblioteca.Incluso si usted es un experto en escribir bibliotecas compartidas en Linux, y se toma su tiempo para minimizar las dependencias para que su biblioteca compartida funcione en diferentes distribuciones de Linux, incluidas versiones antiguas y nuevas, no hay manera de garantizar que funcione en el futuro (digamos, 2 años). Lo más probable es que termine manteniendo el archivo .so, es decir, haciendo pequeñas modificaciones una y otra vez para que el archivo .so sea compatible con las versiones más recientes de las distribuciones de Linux. Esto no es divertido durante mucho tiempo, y disminuye sustancialmente su productividad: el tiempo que dedica a mantener la compatibilidad de la biblioteca se habría gastado mucho mejor, por ej. mejorar la funcionalidad, eficiencia, seguridad, etc. del software.

Tenga en cuenta que es muy fácil molestar a los usuarios al proporcionar una biblioteca en .so formulario, que no funciona en su sistema. (Y no tiene la superpotencia para hacerlo funcionar en todos los sistemas Linux, por lo que esta situación es inevitable.) ¿Proporciona también 32 bits y 64 bits, incluidos x86, PowerPC, ARM, etc.? Si el archivo .so solo funciona en Debian, Ubuntu y Red Hat (porque no tiene tiempo para transferir el archivo a más distribuciones), lo más probable es que moleste a los usuarios de SUSE y Gentoo (y más).

+0

Lo siento, todavía no entiendo por completo este enlace estático y dinámico. ¿Es posible vincular/cargar en tiempo de ejecución (es decir, dinámicamente) una biblioteca estática (un archivo .a)? o simplemente .so archivos son posibles de enlace/carga de forma dinámica? – GetFree

+0

Puede agregar el contenido de un archivo .a al ejecutable en tiempo de compilación (esto se denomina enlace estático). Puede decirle a su ejecutable que busque algún código (símbolos) de un archivo .so cuando comience a ejecutarse (esto se denomina enlace dinámico). No es posible cargar un archivo .a dinámicamente. No es posible añadir el contenido de un archivo .so a un ejecutable en tiempo de compilación/enlace. Es posible vincular algunas bibliotecas de forma estática (si tiene los archivos .a) y algunas bibliotecas de forma dinámica (si tiene los archivos .so) al mismo ejecutable. Un ejecutable sin bibliotecas dinámicas es un ejecutable estático. – pts

4

Idealmente, usted querrá usar GNU autoconf, automake y libtool para crear secuencias de comandos configure y make, luego distribuir la biblioteca como fuente de la Makefile.in archivos de configuración y generada.

Aquí hay un online book sobre ellos.

./configure; make; make install es bastante estándar en Linux.

La raíz del problema es que Linux se ejecuta en muchos procesadores diferentes. No puede confiar solo en que el procesador admita instrucciones x86 como lo hace Windows (para la mayoría de las versiones: Itanium (XP y más reciente) y Alpha (NT 4.0) son las excepciones).

0

La respuesta de Tinkertim es perfecta. Añadiré que es importante comprender y planificar los cambios en gcc's ABI. Las cosas han sido bastante estable recientemente, y supongo que todas las distribuciones principales son el gcc 4.3.2 o menos. Sin embargo, cada pocos años algunos change to the ABI (especialmente los bits relacionados con C++) parecen causar caos, al menos para aquellos que desean liberar binarios de distribución cruzada y para los usuarios que se han acostumbrado a recoger paquetes de otras distros de lo que realmente corren y encontrar trabajan. Mientras se desarrolla una de estas transiciones (todas las distribuciones de las distribuciones a su propio ritmo) lo ideal es que desee liberar libs con ABI que admitan la gama completa de versiones de gcc que utilizan sus usuarios.

Cuestiones relacionadas