Обычным случаем является статическая связь с третьей пользовательской библиотекой при динамическом связывании с системными инфраструктурами и библиотеками, поэтому вашим пользователям не нужно устанавливать сторонние библиотеки перед использованием вашей программы. Если библиотека динамически связана с фреймворками (как это часто бывает), она все равно может поставляться со статическим .a, но недостаточно просто заменить -l<libname>
на /path/to/libname.a
, потому что .a не будет иметь зависимостей в этом. Вам также придется динамически связываться с теми фреймворками, которые использовала ваша библиотека.
Например, скажем, вы хотите написать программу, которая использует libusb с открытым исходным кодом, не требуя от пользователя загрузки и установки libusb. Допустим, у вас есть динамически связанный двоичный файл, который вы создали с помощью этого:
clang -lusb-1.0 main.c -o myprogram
Для статической ссылки на OS X команда выглядит следующим образом (обратите внимание на аргументы -framework
):
clang -framework CoreFoundation -framework IOKit main.c /path/to/libusb-1.0.a -o myprogram
Чтобы узнать, какие системные платформы и библиотеки вам нужно добавить, посмотрите на сторонний dylib с помощью otool:
otool -L /usr/local/opt/libusb/lib/libusb-1.0.0.dylib
, который показывает:
/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)
Вы можете начать с добавления фреймворков, за которыми следуют библиотеки по одной, и вы увидите, что список неопределенных ошибок ссылок сокращается. Обратите внимание, что вам, вероятно, не нужно добавлять каждую библиотеку, потому что некоторые из них могут быть загружены как зависимости для тех, которые вы добавили явно.
Если вы не уверены, где находится dylib, соберите вашу программу оригинальным динамическим способом (с -lusb-1.0) и запустите на нем otool:
clang -lusb-1.0 main.c -o myprogram
otool -L myprogram
, что дает:
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)
Также ознакомьтесь с лицензией библиотеки, на которую вы ссылаетесь.