sistema sierra puedo operativo nuevo mac instalar high duro disco descargar como capitan macos linker static-libraries

macos - sierra - Cómo un enlace estático en OS X



os x el capitan descargar (5)

Intento vincularme a una biblioteca estática en OS X. Utilicé el indicador -static en el comando gcc pero recibo el siguiente mensaje de error:

ld_classic: can''t locate file for: -lcrt0.o collect2: ld returned 1 exit status

Busqué en las páginas man y se lee algo así como:

Esta opción no funcionará en Mac OS X a menos que todas las bibliotecas (incluido libgcc.a) también se hayan compilado con -static. Como no se proporciona una versión estática de libSystem.dylib ni crt0.o, esta opción no es útil para la mayoría de las personas.

¿Hay alguna otra forma de vincular a esta biblioteca estática?



Me he encontrado con el mismo problema. Aquí hay un ejemplo para solucionar:

PASO 1: crea archivos

myfunc1.c:

#include <stdio.h> void myfunc1() { printf( "This is my func1!/n" ); }

myfunc2.c:

#include <stdio.h> void myfunc2() { printf( "This is my func2!/n" ); }

y myfunc.c:

#include <stdio.h> void myfunc1( void ); void myfunc2( void ); int main() { myfunc1(); myfunc2(); return 0; }

PASO 2: crea la lib

gcc -c myfunc1.c myfunc2.c ar -r libmyfuncs.a myfunc1.o myfunc2.o

PASO 3: enlace

gcc -o myfunc -L. myfunc.c -lmyfuncs

No olvides escribir "-L"; dot indica la ruta actual.

Espero que ayude.


Para vincular a una biblioteca de archivos (a veces también llamada biblioteca estática), simplemente agréguela a la línea de enlace:

gcc main.o ... -lfoo ...

El enlazador buscará libfoo.dylib, y luego libfoo.a, que es todo lo que necesita.

Si tiene ambas versiones de la biblioteca y desea vincularla con una versión de archivo en lugar de una dinámica, simplemente especifique la ruta completa al archivo en la línea del enlace:

gcc main.o ... /path/to/libfoo.a ...


Un caso común es el enlace estático contra una tercera biblioteca de usuario mientras se enlaza dinámicamente con las bibliotecas y los marcos del sistema , por lo que los usuarios no necesitan instalar libs de terceros antes de usar su programa. Si la biblioteca está vinculada dinámicamente con marcos (como suele ser el caso), aún puede enviarse con un .a estático, pero no es suficiente simplemente para reemplazar -l<libname> con /path/to/libname.a porque el .a no tendrá las dependencias en él. También tendrá que vincular dinámicamente con los marcos que su biblioteca estaba usando.

Por ejemplo, supongamos que quiere escribir un programa que utiliza el libusb de código abierto sin que el usuario tenga que descargar e instalar libusb. Digamos que tiene un binario vinculado dinámicamente que construyó con esto:

clang -lusb-1.0 main.c -o myprogram

Para vincular estáticamente en OS X, el comando se ve así (observe los argumentos -framework ):

clang -framework CoreFoundation -framework IOKit main.c /path/to/libusb-1.0.a -o myprogram

Para encontrar qué marcos de sistema y bibliotecas necesita agregar, mire el tercero dylib usando otool:

otool -L /usr/local/opt/libusb/lib/libusb-1.0.0.dylib

el cual muestra:

/usr/local/opt/libusb/lib/libusb-1.0.0.dylib: /usr/local/opt/libusb/lib/libusb-1.0.0.dylib (compatibility version 2.0.0, current version 2.0.0) /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1348.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

Puede comenzar agregando los marcos, seguidos por las bibliotecas de uno en uno, y verá cómo se reduce la lista de errores de referencia no definidos. Tenga en cuenta que probablemente no necesite agregar todas las bibliotecas, porque algunas pueden cargarse como dependencias para las que agregó explícitamente.

Si no está seguro de dónde se encuentra el dylib, cree su programa de la manera dinámica original (con -lusb-1.0) y ejecute el comando otorrinolaringólogo en él:

clang -lusb-1.0 main.c -o myprogram otool -L myprogram

lo que da:

myprogram: /usr/local/opt/libusb/lib/libusb-1.0.0.dylib (compatibility version 2.0.0, current version 2.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.0.0)

Además, lea la licencia de la biblioteca a la que está enlazando.


-Bstatic parece ser un no-operativo en OS-X Lion - usó gcc -v para confirmar esto.