Распространенным случаем является статическая ссылка на стороннюю пользовательскую библиотеку при динамическом связывании с системными структурами и библиотеками, поэтому вашим пользователям не нужно устанавливать сторонние библиотеки перед использованием вашей программы. Если библиотека динамически связана с фреймворками (как это часто бывает), она может поставляться со статическим .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)
Также прочтите лицензию библиотеки, на которую вы ссылаетесь.
person
Michael Chinen
schedule
06.01.2017
ld
команд, которые на самом деле это делают. - person mcandre   schedule 30.09.2012