2010-01-05 19 views
5

Im utilizando una implementación de origen de datos de mercado que contiene archivos .so.0. Sin embargo, estos son 'enlaces suaves' a archivos .so.0.0.0 reales. ¿Por qué se hace esto?diferencia entre archivos .so.0 y .so.0.0.0

Cuando intento copiar estos enlaces .so.0, termina copiando una réplica exacta del archivo .so.0.0.0 pero con un prefijo .so.0.

Agregado comentario:

por lo que tiene un archivo libfoo.so, y se está accediendo a ella a través de Java JNI. Este archivo libfoo.so es en realidad un enlace suave que apunta a libfoo.so.0.0.0. Lo que sucede si no tengo libfoo.so. ¿Cómo funciona java/o cualquier otro código compilado, averiguar que libfoo.so.0.0.0 si el objeto compartido para usar?

+3

lo que es una 'fuente de datos de mercado'? ¿Qué son estos archivos? ¿Qué tiene esto que ver con Java? – bmargulies

+0

creo que _ "fuente de datos de mercado" _ es probablemente una solución COTS conexión de datos de algún tipo que se incluye su aplicación en un archivo objeto compartido, pero no soy un programador de Java;) –

+0

Esto no está relacionado con Java - su entonces los archivos son encontrados por una aplicación dependiente de la plataforma, por ejemplo 'ld' en Linux. –

Respuesta

7

Esto es para que los programas se puedan enlazar a cualquier versión de libfoo que tenga la misma interfaz (quiero las últimas actualizaciones de libfoo) o vincular a una versión específica (quiero estabilidad y solo la versión exacta que probé) .

+0

entonces tengo un archivo libfoo.so, y java lo está accediendo a través de jni. Este archivo libfoo.so es en realidad un enlace suave que apunta a libfoo.so.0.0.0 Qué sucede si no tengo libfoo.so. ¿Cómo funciona java/o cualquier otro código compilado, averiguar que libfoo.so.0.0.0 si el objeto compartido para usar? – user242591

+0

Lea la página man 'ld', si está en Linux. –

+0

Si tiene libfoo.so.0.0.0, siempre debe tener libfoo.so.0 y libfoo.so, esto es parte de cómo funciona libtool; si no existe, que están generando las bibliotecas mal –

8

El 0,0 y .0.0.0 archivos existentes, para que el control de versiones puede suceder:

  • foo.0 representa la versión 0.0 de la biblioteca. Todas las versiones .0 de la biblioteca utilizarán la misma interfaz, pero puede haber diferentes implementaciones. (Afortunadamente, las implementaciones posteriores tendrán menos errores que las anteriores.)

  • foo.0.0.0 representa una implementación específica de la versión .0.

No es útil, ahora, tener el soft-link. Pero esto es lo que podría pasar:

El programador de foo encuentra un error en su biblioteca. Lanza foo.0.0.1. Y foo.0 ahora enlaces a foo.0.0.1. Luego suceden dos cosas:

  • Todos los archivos que enlazan a foo.0 se actualizarán automáticamente a foo.0.0.1.
  • Todos los archivos que enlazan con foo.0.0.0 seguirán usando la vieja foo.0.0.0
+0

extender esta unos niveles aún más y se puede requerir una coincidencia exacta versión vinculando contra 'libfoo.0.0.0' o cualquier versión de interfaz coincidente con' libfoo.0' o cualquier versión en absoluto con 'libfoo'. –

+0

Disculpa por la pregunta básica, pero ¿cómo se especifica este enlace? ¿Cómo puedo especificar que jni debería usar libfoo.so y no libfoo.so.0.0.0? – user242591

+0

Hihi, codificador zambesi. Lamentablemente, los documentos de Java no son de mucha ayuda: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#loadLibrary(java.lang.String) dice "La manera de que el nombre de una biblioteca se asigna a la biblioteca del sistema real depende del sistema ". Puede haber alguna ayuda en http://stackoverflow.com/questions/1010503/how-to-debug-a-java-system-loadlibrary-error-in-linux Buena suerte. –

Cuestiones relacionadas