Pregunta

Tengo un programa (en concreto mi entrada para el SO desafío DevDays Cuenta atrás aplicación ) que se basa en varias bibliotecas dinámicas, a saber libSDL, libSDL_ttf, y otros. He instalado bajo /opt/local/lib a través de MacPorts estas bibliotecas, y muchas personas no voy a tener estas instalado (y algunos de ellos podría haber instalado, pero no en ese lugar).

¿Cómo distribuyo mi programa para que las personas sin estas bibliotecas instaladas pueden ejecutar fuera de la caja? Obviamente voy a tener que distribuir los diversos archivos .dylib, pero haciendo esto no es suficiente. El cargador dinámico todavía se ve por las bibliotecas instaladas en los lugares que tengan instaladas en. ¿Hay una manera de contar el cargador dinámico para buscar en el directorio actual del archivo ejecutable, como lo hace Windows con DLL? La gente no debería tener que modificar las variables de entorno (por ejemplo DYLD_LIBRARY_PATH), ya que más quiero que esto funcione fuera de la caja.

¿Fue útil?

Solución

Como se ha mencionado que no se esté usando Xcode, así que es un poco difícil. Aquí están las opciones en mi orden de preferencia:

  1. Cambiar a Xcode. Use marcos. Las bibliotecas SDL están disponibles como marcos ya, y he visto más de un par de juegos comerciales con un libsdl.framework dentro del paquete de aplicación.

  2. Use marcos, pero mantienen su Makefile. Descargar las versiones marco de sus bibliotecas SDL (o construirlos usted mismo), y el enlace con ellos con la bandera -framework enlazador. Distribuir los marcos con su aplicación o no, y decirle a sus usuarios para ponerlos en cualquiera de ~ / Library / Frameworks o en los marcos / Library /. No me molestaría con un instalador para esto.

  3. Enlace dinámico con SDL. En el Makefile, usted tiene que anotar el camino de las librerías estáticas en lugar de utilizar la opción -l, por ejemplo, se corre "ld bla bla /opt/local/lib/libsdl.a". No hay manera que sé para contar -l preferir estática sobre bibliotecas compartidas, y créeme, he mirado.

Otros consejos

El enfoque básico para esto es por el envío en el paquete .app. A continuación, modifica la ubicación del enlazador busca bibliotecas compartidas para incluir esto.

Los pasos son:

  1. Crear un nuevo archivo de copia construyen fase a su objetivo que copia los archivos en el directorio de los marcos del paquete .app.

  2. Editar el ajuste "RUNPATH rutas de búsqueda" para incluir @executable_path/../Frameworks configuración de generación

Si usted construye su ejecutable con estos cambios y luego mire, usted debe encontrar que existen las dylibs en el directorio Foo.app/Contents/Framework y funcionando otool -L Foo.app/Contents/MacOS/Foo deben producir y la entrada con el prefijo @rpath para aquellos dylibs.

A partir de este Cocoabuilder posterior :

En general, @loader_path se prefiere sobre @executable_path, ya que
permite marcos para trabajar tanto en un ejecutable y un paquete,
incrustado plugin, o sub-marco. El único inconveniente es que @loader_path
requiere 10.4 o más reciente. Si se encuentra en 10.5 o más reciente, es @rpath Impar mejor que @loader_path.

enlazar estáticamente las bibliotecas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top