Как статическая ссылка на OS X

Я пытаюсь подключиться к статической библиотеке в OS X. Я использовал флаг -static в команде gcc, но получаю следующее сообщение об ошибке:

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

Я просмотрел страницы руководства, и там написано что-то вроде:

Эта опция не будет работать в Mac OS X, если все библиотеки (включая libgcc.a) также не были скомпилированы с -static. Поскольку ни статическая версия libSystem.dylib, ни crt0.o не предусмотрена, эта опция бесполезна для большинства людей.

Есть ли другой способ связать эту статическую библиотеку?


person Community    schedule 10.05.2009    source источник
comment
Глупые документы Apple рекомендуют динамическое связывание, но они не показывают никаких ld команд, которые на самом деле это делают.   -  person mcandre    schedule 30.09.2012


Ответы (5)


Чтобы создать ссылку на архивную библиотеку (иногда также называемую статической библиотекой), просто добавьте ее в строку ссылки:

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

Компоновщик будет искать libfoo.dylib, а затем libfoo.a, и это все, что вам нужно.

Если у вас обе версии библиотеки и вы хотите связать с архивной версией вместо динамической, просто укажите полный путь к архиву в строке ссылки:

gcc main.o ... /path/to/libfoo.a ...
person Employed Russian    schedule 10.05.2009
comment
В OS X и XCode нет crt0.o, crt0.a или чего-то подобного. - person alecco; 04.12.2009
comment
@alecco Вы можете получить crt0.o через Csu (сокращение от C запускается), но, к сожалению, этот crt0.o не может установить связь с libc, поскольку не существует статической версии libSystem.dylib. Дополнительные сведения об этой проблеме см. В билете Github для Csu. - person GDP2; 28.11.2017

К сожалению, не поддерживается . Некоторые люди сообщали, что можно вручную скомпилировать crt0, но это никто не подтверждает.

person alecco    schedule 04.12.2009
comment
Вы можете скомпилировать crt0.o через Csu (сокращение от C start up ), но, к сожалению, crt0.o не может установить связь с libc, поскольку статической версии libSystem.dylib не существует. Так что да, он не поддерживается, пока Apple не предоставит нам статическую версию libSystem.dylib. Либо так, либо не используйте libc. Подробнее об этом билете Github для Csu. - person GDP2; 28.11.2017

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

-Bstatic, похоже, не работает в OS-X Lion - использовал gcc -v, чтобы подтвердить это.

person atrens    schedule 07.08.2012

Я столкнулся с той же проблемой. Вот пример, который нужно обойти:

ШАГ1: создать файлы

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" );
}

и myfunc.c:

#include <stdio.h>

void myfunc1( void );
void myfunc2( void );

int main() {
    myfunc1();
    myfunc2();
    return 0;
}

ШАГ 2: создайте библиотеку

gcc -c myfunc1.c myfunc2.c

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

ШАГ 3: ссылка

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

Не забудьте ввести «-L.»; точка указывает текущий путь.

Надеюсь, это поможет.

person Zhi Q.    schedule 11.06.2017