tools mac for xcode gcc linker

mac - ¿Forzar enlaces estáticos de la biblioteca vinculados al objetivo de Xcode?



install gcc mac (4)

Mis enlaces de destino de 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.

El resultado de texto de la compilación muestra que hay, como se esperaba, 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.



En respuesta a su comentario sobre la respuesta de Eduard Wirch: también puede controlar los enlaces estáticos para esta única biblioteca, si reemplaza -lhdf5 por -l / completo / ruta / a / libhdf5.a


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

Sin embargo, normalmente solo proporciona el interruptor ''-estático'' para el enlazador, 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 intenté esto.

Lo que funcionó para mí fue reemplazar:

-lmylib

con

/path/to/libmylib.a

Nota: el -l se descarta.


Mi caso con Xcode 4.5:

Cuando arrastro y coloco una biblioteca de C estática (una biblioteca de terceros compilada con GNU Autotools) en los marcos del proyecto ( Project Navigator > Frameworks ) el enlazador parece pensar que es una biblioteca dinámica y agrega -L -l flags:

-L/path/to/libfoodir -lfoo

El enlace falla porque no hay /path/to/libfoodir/libfoo.dylib . El comando del enlazador se puede ver desde:

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

El enlace tiene éxito cuando agrego una ruta completa ( /path/to/libfoodir/libfoo.a ) a la configuración del enlazador:

Targets > Build Settings (all) > Other linker flags