¿Dónde configuro DYLD_LIBRARY_PATH en Mac OS X, y es una buena idea?

28

Estoy tratando de instalar un solucionador escrito en C ++ en mi Mac (OS X), para usar con el código que he escrito en XCode.

La documentación del solucionador dice esto:

Asegúrese de tener "." en su DYLD_LIBRARY_PATHfin de

  • ejecutar los ejecutables listos para usar
  • enlace con libamg.dylib (y los gfortran RTSlibs)

Realmente no entiendo lo que esto significa. ¿Dónde y qué necesito para cambiar qué?

¡He buscado en Google, pero no he encontrado nada que sea lo suficientemente simple para un novato como yo! Si hay personas pacientes por ahí a las que no les importaría dirigirme a un recurso en línea o darme la base de cómo y dónde establecer variables de entorno, estaría muy agradecido.

Hormiga
fuente

Respuestas:

20

Es una variable de entorno y, como tal, generalmente se establece en Terminal por

export DYLD_LIBRARY_PATH=someValue

man dyld dice:

DYLD_LIBRARY_PATH

Esta es una lista de directorios separados por dos puntos que contienen bibliotecas. El vinculador dinámico busca estos directorios antes de buscar las ubicaciones predeterminadas para las bibliotecas. Le permite probar nuevas versiones de bibliotecas existentes.

Para cada biblioteca que utiliza un programa, el vinculador dinámico lo busca en cada directorio DYLD_LIBRARY_PATH. Si aún no puede encontrar la biblioteca, entonces busca DYLD_FALLBACK_FRAMEWORK_PATHy DYLD_FALLBACK_LIBRARY_PATHalternadamente.

Use la -Lopción para otool(1). para descubrir los marcos y las bibliotecas compartidas con las que está vinculado el ejecutable.


Probablemente quieras algo como

export DYLD_LIBRARY_PATH=.:$DYLD_LIBRARY_PATH

anteponer .(directorio actual) a la lista de ubicaciones buscadas. DYLD_LIBRARY_PATHSin embargo, en mi OS X no modificado, no tiene valor actual:

$ echo $DYLD_LIBRARY_PATH

$

Dependiendo de cómo intente ejecutar su programa, necesitará configurarlo de manera diferente, por ejemplo, en Xcode (aunque no sé dónde).

Daniel Beck
fuente
1
Estoy de acuerdo con @TVNshack en que generalmente no debe configurar DYLD_LIBRARY_PATHni DYLD_FRAMEWORK_PATH, porque puede evitar que esas bibliotecas cargadas encuentren bibliotecas proporcionadas por el sistema. Para que eso funcione mejor, use en su lugar las FALLBACKversiones. Más información en esta respuesta: stackoverflow.com/a/3172515/43615
SuperTempel
21

Uno nunca debe configurar export DYLD_LIBRARY_PATHen su sistema.

Rutas de bibliotecas compartidas se pueden fijar usando otool -Ly install_name_tool.

Por ejemplo, si compila Perl DBD-MySQL, no podrá usarlo ya que el enlazador no sabe dónde ha instalado MySQL.

># make
....


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)


#> install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysqlclient.18.dylib blib/arch/auto/DBD/mysql/mysql.bundle


># otool -L blib/arch/auto/DBD/mysql/mysql.bundle

blib/arch/auto/DBD/mysql/mysql.bundle:
        /usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0.0, current version 18.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)



#> make test
...
Result: PASS

#> make install

Esto es tan simple como eso.

TVNshack
fuente
Para su información rápida: install_name_tool fallará en silencio si la nueva ruta es más larga que la ruta que está reemplazando. Siempre verifique con 'otool -L' que la ruta haya cambiado como se esperaba.
user15685
Digamos que compilo un complemento (básicamente una biblioteca dinámica por sí mismo) que depende de otra biblioteca dinámica. ¿Cómo debo suministrar el complemento y sus dependencias para otros usuarios?
Royi
Si en lugar de configurar DYLD_FALLBACK_FRAMEWORK_PATH, que hace el trabajo en este caso. Eso es mucho más fácil que cambiar las rutas internas de las bibliotecas, especialmente si necesita entregar los dylibs integrados con su aplicación y no puede predecir la ruta en la que terminan.
SuperTempel
7

En Xcode 4 puede agregarlo al Esquema del proyecto para evitar errores como este:

dyld: Library not loaded: @loader_path/libLeap.dylib
  Referenced from: /Users/paulsolt/Library/Developer/Xcode/DerivedData/LeapTest-eqcxmzewheyjusgrcszyvlcxlgna/Build/Products/Debug/LeapTest
  Reason: image not found
  1. En el menú, haga clic en "Producto" -> "Editar esquema" -> pestaña "Argumentos" -> Agregar "Variables de entorno" -> Clave: DYLD_LIBRARY_PATH Valor: / Users / MyUserAccount / path / to / lib

  2. Cambie la ruta a su cuenta de usuario y la ruta completa a la carpeta de la biblioteca.

  3. Deberías poder construir y ejecutar.

Configuración de DYLD_LIBRARY_PATH en Xcode 4

Paul Solt
fuente