2009-03-12 16 views
9

Actualmente estoy desarrollando un programa en Qt y usa la biblioteca libqextserialport.1.dylib.¿Cómo puedo vincular una biblioteca dinámica en Xcode?

construyo y se ejecutan en x-código y escupe hacia atrás:

dyld: Library not loaded: libqextserialport.1.dylib 
    Referenced from: /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/QtOpenCV 
    Reason: image not found 

La biblioteca se encuentra en/Usuarios/samuelreh/Escritorio/QtOpenCV/qextserialport/build /.

puedo correr mi programa al cambiar a la carpeta ejecutable /Users/samuelreh/Desktop/QtOpenCV/build/Debug/QtOpenCV.app/Contents/MacOS/ y entrando:

install_name_tool -change libqextserialport.1.dylib /Users/samuelreh/Desktop/QtOpenCV/qextserialport/build/libqextserialport.1.dylib QtOpenCV

sé probablemente haya muchas soluciones además de esto. ¿Alguien sabe cuál es el mejor/más elegante/fácil de hacer desde el código x?

Respuesta

2

Si entiendo su problema correctamente, su aplicación está construyendo bien, no hay errores al vincular, pero cuando intenta iniciarla no se puede encontrar la biblioteca.

Eso no es sorprendente, ya que el archivo es dylib en algún directorio arbitrario no en la ruta del sistema. O bien debe copiarlo en /usr/lib (probablemente no es una buena idea) o incluirlo en el paquete de la aplicación. Este último es probablemente el mejor enfoque.

Nunca lo he intentado, pero aparentemente necesita usar un Copy Files Build Phase para poner el dylib dentro de su paquete y luego configure Xcode para que su ejecutable sepa dónde encontrarlo.

+0

¿Qué sucede si está compilando un ejecutable sin paquete? – John

0

Simplemente arrastre la biblioteca desde el directorio a su proyecto de Xcode, mejor en recursos, pero no importa (creo). Intenté con y sin verificar los 'archivos de copia en paquete' y funciona en ambos casos, no estoy seguro si necesita incluirlo en el paquete para la implementación.

He probado esto con sqlite3 y aplicación de cacao (cacao-touch).

4

Acabo de hacer exactamente esto, con un proyecto Module Bundle. Esto se estaba incluyendo en un proyecto más grande con un ejecutable por separado.

Agregué un paso "Copiar dylibs a frameworks", que copió los dylibs a /Foobar.bundle/Contents/Frameworks/Foobar/. Luego añade una fase de secuencias de comandos Ejecutar para ejecutar como el paso final, para fijar los nombres de instalar los dylibs en el ejecutable:

install_name_tool -change libBobDylan.dylib @executable_path/../Plugins/Foobar.bundle/Contents/Frameworks/Foobar/libBobDylan.dylib path/to/build/product/Foobar.Bundle/Contents/MacOS/Foobar 

Por supuesto, también vinculado a libBobDylan.dylib libBillyIdol.dylib. Así que tuve que añadir otra fase de ejecución de secuencias de comandos en el comienzo mismo del objetivo de fijar los nombres de instalar aquí:

install_name_tool -change libBillyIdol.dylib @executable_path/../Plugins/FooBar.bundle/Contents/Frameworks/Foobar/libBillyIdol.dylib local/path/to/libBobDylan.dylib 

que tenían más de una docena de estos para enlazar contra; Tuve que persuadir al proveedor de los dylibs para que rellenaran su encabezado para acomodar mis muchos cambios de install_name ...

Cuestiones relacionadas