visual studio para macbook mac devc dev compilar code c++ macos build load dylib

studio - xcode c++ download



Cómo usar dylib en Mac OS X(C++) (4)

Hice una aplicación (un ejecutable) llamando a algunos dylib con éxito, sin embargo, los archivos dylib y el ejecutable están en un directorio diferente. Agregué que el directorio contiene archivos dylib a la variable de entorno $ PATH, sin embargo, todavía no se carga. Copio todos los archivos dylib al ejecutable, el programa finalmente se ejecuta. Esto confirma que los archivos dylib no tienen ningún problema. Sin embargo, ¿cómo puedo decirle al sistema operativo que lo encuentre? En Windows, solo necesito agregar la ruta del directorio contiene archivos dll a $ PATH. ¿Qué debo hacer para Mac OS X? ¡Muchas gracias!


Después de leer el enlace que proporcionó Justin, pude usar con @executable_path token @executable_path para cambiar mi dylib nombre_instalación para que apunte al mismo directorio donde se encuentra mi ejecutable.

@executable_path Las rutas absolutas son molestas. En ocasiones, desea insertar un marco en una aplicación en lugar de tener que instalar el marco en / Library o en una ubicación similar.

La solución de Mac para esto es @executable_path. Este es un token mágico que, cuando se coloca al comienzo del nombre de instalación de una biblioteca, se expande a la ruta del ejecutable que lo está cargando, menos el último componente. Por ejemplo, digamos que Bar.app vincula contra Foo.framework. Si Bar.app está instalado en / Applications, @executable_path se expandirá a /Applications/Bar.app/Contents/MacOS. Si tiene la intención de insertar el marco en Contents / Frameworks, puede simplemente establecer el nombre de instalación de Foo.framework en @executable_path /../ Frameworks / Foo.framework / Versions / A / Foo. El vinculador dinámico lo ampliará a /Applications/Bar.app/Contents/MacOS/../Frameworks/Foo.framework/Versions/A/Foo y encontrará el marco allí.

http://www.mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html

Voy a demostrar con un ejemplo.

Digamos que tengo el siguiente ejecutable / opt / local / bin / convert y sus dylibs están en / opt / local / lib . Quiero copiarlo a otro directorio y hacer que cargue sus dylibs desde el mismo directorio donde copié el ejecutable.

> mkdir ~/tmp/bin > cp /opt/local/bin/convert ~/tmp/bin

Obtener una lista de ejecutables dylibs

> otool -L ~/tmp/bin/convert ~/tmp/bin/convert: /opt/local/lib/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) /opt/local/lib/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0) /opt/local/lib/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0) /opt/local/lib/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0) /opt/local/lib/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0) /opt/local/lib/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0) /opt/local/lib/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6) /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6) ...

Solo me preocupan los dylibs en el directorio / opt / local / lib , por lo que solo sacamos dylibs en / opt . Quiero mantener intactas todas las otras referencias de dylib especialmente para / usr / lib / libSystem .

> DYLIBS=`otool -L ~/tmp/bin/convert | grep "/opt" | awk -F'' '' ''{ print $1 }''`

Copie todos los dylibs que el ejecutable hace referencia al mismo directorio donde se ha copiado el ejecutable.

> for dylib in $DYLIBS; do cp $dylib ~/tmp/bin/; done;

Use la install_name_tool para cambiar el nombre de la instalación de todos los dylibs que extrajimos en el paso anterior y reemplácelos @executable_path el @executable_path al nombre de dylib. Esto hará que el enlazador dinámico busque el dylib en el mismo directorio donde se encuentra el ejecutable.

> for dylib in $DYLIBS; do install_name_tool -change $dylib @executable_path/`basename $dylib` ~/tmp/bin/convert; done;

Confirme que los nombres de las instalaciones se hayan cambiado y que libSystem todavía esté apuntando a / usr / lib / libSystem .

> otool -L ~/tmp/bin/convert ~/tmp/bin/convert: @executable_path/libtiff.3.dylib (compatibility version 13.0.0, current version 13.5.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) @executable_path/libjpeg.8.dylib (compatibility version 12.0.0, current version 12.0.0) @executable_path/libfontconfig.1.dylib (compatibility version 6.0.0, current version 6.4.0) @executable_path/libiconv.2.dylib (compatibility version 8.0.0, current version 8.1.0) @executable_path/libfreetype.6.dylib (compatibility version 15.0.0, current version 15.0.0) @executable_path/libexpat.1.dylib (compatibility version 7.0.0, current version 7.2.0) @executable_path/libbz2.1.0.dylib (compatibility version 1.0.0, current version 1.0.6) @executable_path/libz.1.dylib (compatibility version 1.0.0, current version 1.2.6) ...



Si el dylib está en el lugar especificado por INSTALL_NAME de la biblioteca, solo funcionará *.

De lo contrario, puede agregar la ubicación de dylib a DYLD_LIBRARY_PATH. Es posible que desee leer la documentación dyld .

*) para ser totalmente preciso, debe estar en DYLD_ROOT_PATH / INSTALL_NAME, pero molestarse con DYLD_ROOT_PATH es bastante raro.


DYLD_LIBRARY_PATH establecer la variable de entorno DYLD_LIBRARY_PATH .

De la página dyld man :

This is a colon separated list of directories that contain libraries. The dynamic linker searches these directories before it searches the default locations for libraries. It allows you to test new versions of existing libraries. For each library that a program uses, the dynamic linker looks for it in each directory in DYLD_LIBRARY_PATH in turn. If it still can''t find the library, it then searches DYLD_FALL- BACK_FRAMEWORK_PATH and DYLD_FALLBACK_LIBRARY_PATH in turn.