¿Conflicto entre la prioridad de enlace dynamic en OSX?

Existe un conflicto de vinculación dinámica entre diferentes bibliotecas dinámicas de libjpeg en OSX. Primero hay una libJPEG.dylib nativa estándar (en /System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/). Pero si está utilizando MacPorts, también puede tener una libjpeg.dylib relacionada con el puerto en (en / opt / local / lib). Este último puede, por ejemplo, haber sido instalado como una dependencia para algún otro puerto.

Esto crea un problema cuando se vincula con su sistema libJPEG (que es el preferido). Entonces, si /opt/local/lib está en DYLD_LIBRARY_PATH, esa ruta se priorizará cuando se busque una lib dinámica, lo que da como resultado un error de tiempo de ejecución al cargar símbolos:

 dyld: Symbol not found: __cg_jpeg_resync_to_restart Referenced from: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO Expected in: /opt/local/lib/libJPEG.dylib in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO Trace/BPT trap: 5 

Entonces tengo dos preguntas (probablemente relacionadas):

  1. ¿Cuál es una buena manera de resolver el problema real (eliminar /opt/local/lib de DYLD_LIBRARY_PATH obviamente lo soluciona pero crea problemas para otras dependencias)?

  2. ¿En qué otras rutas se buscan las bibliotecas dinámicas (es decir, dónde se especifica la ruta “/ Sistema / Biblioteca”) y por qué DYLD_LIBRARY_PATH tiene una prioridad más alta?

No debe establecer rutas de biblioteca con DYLD_LIBRARY_PATH . Como habrás descubierto, eso tiende a explotar. Los ejecutables y las bibliotecas deben tener sus requisitos de biblioteca integrados en el momento del enlace. Use otool -L para averiguar qué busca el archivo:

 $ otool -L /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO: /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO (compatibility version 1.0.0, current version 1.0.0) ... /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 

Para un ejemplo de uno de mis progtwigs homebrew-built:

 $ otool -L /usr/local/bin/gifcolor /usr/local/bin/gifcolor: /usr/local/Cellar/giflib/4.1.6/lib/libgif.4.dylib (compatibility version 6.0.0, current version 6.6.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 

Tenga en cuenta que hace referencia a /usr/local . Si lo ha construido de tal manera que haga referencia a la biblioteca incorrecta, recomiendo reconstruir y apuntarlo a la biblioteca correcta.

Si eso es imposible, es posible editar la ruta que se usa usando install_name_tool , pero hay casos donde esto no funciona, como si la nueva ruta es más larga que la anterior y no la vinculó con -header_pad_max_install_names . Se prefiere reconstruir con la ruta correcta.

Tenga en cuenta que hay algunas rutas de acceso “especiales” disponibles que permiten encontrar bibliotecas en relación con su cargador. Ver @executable_path/ y su parentesco en la página de dyld(1) man dyld(1) .

Experimenté un problema similar al usar OpenCV en MacOS El Capitan. Resuelto el problema usando la solución en el enlace

La solución es eliminar algunos dlylibs en el directorio / usr / local / lib y crear enlaces simbólicos a archivos relacionados /System/Library/Frameworks/ImageIO.framework/Resources/

 cd /usr/local/lib rm libgif.dylib ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libGIF.dylib libGIF.dylib rm libjpeg.dylib ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libJPEG.dylib libJPEG.dylib rm libtiff.dylib ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libTIFF.dylib libTIFF.dylib rm libpng.dylib ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libPng.dylib libPng.dylib 

Tuve un error similar al intentar ejecutar Apache Celix en macOS Sierra. Si usa Homebrew para instalar libjpeg, libtiff, libpng, puede confundir al enlazador para usar la biblioteca macOS imageIO. Una solución simple es desvincular esas libs:

 brew unlink libpng brew unlink libtiff brew unlink libjpeg 

Vuelva a vincular esas bibliotecas cuando necesitemos:

 brew link libpng brew link libtiff brew link libjpeg 

Si usa Qt Creator , debe desmarcar la Add build library search path to DYLD_LIBRARY_PATH and DYLD_FRAMEWORK_PATH de la sección Run en la pestaña Projects :

qtcreator

Tuve un error similar y resolví poner la siguiente variable en mi bash_profile:

 export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH 

Seguí las instrucciones sugeridas por mdemirst y solucionó mi problema. Estoy usando OS X Sierra.

Creé una esencia en caso de que alguien más se encuentre con el mismo problema.

Gist para arreglar los errores de Spidermonkey