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?
Lamentablemente, no es compatible . Algunas personas informaron que es posible compilar manualmente crt0 pero nadie lo confirma .
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.