2009-01-19 8 views
11

Mis enlaces de destino Xcode contra la biblioteca hdf5 (utilizando la fase de compilación Link Binary with Libraries). libhdf5 se instala con MacPorts, por lo tanto/opt/local/lib contiene las versiones dinámicas (.dylib) y estáticas (.a) de la biblioteca.¿Forzar el enlace estático de la biblioteca vinculada al objetivo de Xcode?

El texto de la compilación muestra que, como se esperaba, hay un -lhdf5 en el paso de enlace de la compilación. Sin embargo, gcc parece tomar la biblioteca vinculada dinámica sobre la estática. ¿Hay alguna manera de forzar gcc (a través de un compilador cambiar o a través de Xcode) para vincular estáticamente con libhdf5.a?

La única solución que he encontrado es copiar libhdf5.a al directorio del proyecto (u otro) y vincularlo con esa copia, evitando así tener versiones dinámicas y estáticas en la misma ubicación.

+0

Me encantaría ver algunas respuestas actualizadas a esta pregunta con instrucciones para versiones más recientes de Xcode. – livingtech

Respuesta

7

En reacción a su comentario sobre la respuesta Eduard Wirch': también se puede controlar la vinculación estática para este único biblioteca, si se reemplaza por -lhdf5 - l/lleno/ruta/a/libhdf5.a

+8

Parece que la "-l" realmente necesita ser omitida, según la otra respuesta dada. Si lo incluyo, el enlazador me da "ld: library not found for -l/opt/local/lib/libhdf5.a", mientras que simplemente le pasa la ruta "/ opt/local/lib/libhdf5."sin indicador funciona bien. – spieden

+0

¿Cómo se solucionaría esto al usar automake? – meijuh

1

Utilice el interruptor de "-static" para vincular: GCC link options

+0

¿Forzará esto la vinculación estática de todas las bibliotecas, o puede su aplicación controlarse por biblioteca? –

+0

En realidad, vinculará todas las bibliotecas estáticas. –

13

Tenía este mismo problema y, a pesar de ser una publicación anterior, pensé que compartiría lo que tenía que hacer para que esto funcionara.

Por lo general, simplemente debe proporcionar el interruptor '-static' al vinculador, sin embargo, con Xcode esto hace que todas las libretas, incluido el crt, estén vinculadas estáticamente. Obtuve el error:

can't locate file for: -lcrt0.o 

Cuando probé esto.

Lo que funcionó para mí fue reemplazar:

-lmylib 

con

/path/to/libmylib.a

Nota: el -l se deja caer.

3

mi caso con Xcode 4.5:

Cuando arrastrar y soltar una biblioteca estática C (una biblioteca tercera parte compilado con GNU Autotools) a los marcos del proyecto (Project Navigator > Frameworks) el enlazador parece piensa que es una biblioteca dinámica y añade -L -l banderas:

-L/path/to/libfoodir -lfoo 

La vinculación falla porque no hay /path/to/libfoodir/libfoo.dylib. comando de enlace se puede ver a partir de:

Log Navigator > select a Build log > select a Link line and expand it 

La vinculación tiene éxito cuando agrego una ruta completa (/path/to/libfoodir/libfoo.a) a la configuración del vinculador:

Targets > Build Settings (all) > Other linker flags 
Cuestiones relacionadas