Un caso común es enlace estático contra una tercera biblioteca de usuario mientras enlaza dinámicamente con los marcos de sistema y bibliotecas, 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 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 desea 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 enlazado dinámicamente que construyó con esto:
clang -lusb-1.0 main.c -o myprogram
Para enlazar estáticamente en OS X, el comando es el siguiente (tenga en cuenta las -framework
argumentos):
clang -framework CoreFoundation -framework IOKit main.c /path/to/libusb-1.0.a -o myprogram
Para encontrar marcos qué sistema y las bibliotecas que necesita añadir, miran el dylib terceros usando otool:
otool -L /usr/local/opt/libusb/lib/libusb-1.0.0.dylib
que 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 añadiendo 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 que existe la dylib, construir su programa de la forma dinámica original (con -lusb-1.0), y ejecutar otool 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.
Los estúpidos documentos de Apple recomiendan enlaces dinámicos, pero no muestran ningún comando 'ld' que realmente lo haga. – mcandre