2012-03-06 13 views
5

Estoy usando la biblioteca de Boost en OS X usando Xcode. Boost fue instalado en mi sistema usando macports. He creado mi aplicación con éxito agregando las 3 bibliotecas de impulso que necesito (por ejemplo, libboost_thread-mt.a) a esa lista de 'Binarios de enlaces con bibliotecas'. Sin embargo, necesito vincular estas bibliotecas estáticamente para que la aplicación se ejecute en otras computadoras sin necesidad de instalar la biblioteca de impulso.Aumentar la vinculación estática de la biblioteca en Xcode 4

¿Cómo hago esto exactamente? A través de mis numerosas búsquedas en Google, descubrí que podría necesitar agregar '-static', ¿dónde lo agrego en Xcode?

Respuesta

7

Si ha vinculado con una biblioteca .a, entonces ya se ha vinculado estáticamente. Nunca necesita enviar bibliotecas .a. Son solo paquetes de objetos.


EDIT: Su error sugiere fuertemente que va a asociar la dylib en lugar de la .a. Si tiene libfoo.dylib y libfoo.a en la ruta de acceso de su biblioteca, incluso si dice "link libfoo.a" en Xcode, e incluso si libfoo.a está más arriba en la ruta de búsqueda, aún enlazará libfoo.dylib. Esto se debe a que la vinculación de Xcode está totalmente rota y pasa -lfoo al enlazador (nunca debe usar -l para algo que haya creado y tenga la ruta exacta). Siempre recomiendo vincular las bibliotecas que construyó en LDFLAGS en un archivo xcconfig en lugar de usar el panel de compilación. Pase la ruta exacta que desee en lugar de usar -l. Consulte Abandoning the Build Panel para obtener más información acerca de xcconfig. Ahora está desactualizado, ya que fue escrito para Xcode3, pero los conceptos básicos aún se aplican.

Usando el panel de compilación, también puede pasar la ruta completa a la biblioteca en "Otros indicadores de enlazador". Pero esto todavía tiene todos los problemas del panel de compilación.

La solución más rápida (pero menos robusta) a veces es agregar -Wl,-search_paths_first a los "Otros indicadores del enlazador". Esto cambia el comportamiento para que cada ruta de biblioteca se busque .dylib y .a antes de continuar (el comportamiento predeterminado es buscar en todas partes .dylib y solo luego buscar .a). Entonces, si su .a está en un directorio diferente al .dylib, y ese directorio está más temprano en la ruta de búsqueda, esto funcionará.

Esta pregunta finalmente me hizo abrir un radar en esto, lo que debería haber hecho hace años. Recomiendo que otros abran duplicates.

+0

Eso es lo que pensé sin embargo cuando intenté ejecutar la aplicación en una computadora diferente, la aplicación no se ejecutará y aparece un error que dice que no puede encontrar el archivo .dylib relevante. ¿Los archivos .a deben estar vinculados al proyecto en otro lugar que no sea dentro de la sección "Enlace binario con bibliotecas"? –

+0

"Al usar el panel de compilación, también puede pasar la ruta completa a la biblioteca en" Otras banderas de enlace ". Esto solucionó el problema. ¡Gracias! –

Cuestiones relacionadas