Подтвердить что ты не робот

Как статическая ссылка на 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) также не были скомпилированы с -статическим. Поскольку ни статическая версия libSystem.dylib, ни crt0.o не предоставляются, этот параметр не подходит большинству людей.

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

4b9b3361

Ответ 1

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

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

Линкером будет поиск libfoo.dylib, а затем libfoo.a, который вам нужен.

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

gcc main.o ... /path/to/libfoo.a ...

Ответ 3

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

Ответ 4

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

Вы можете начать с добавления фреймворков, за которыми следуют библиотеки по одному, и вы увидите, что список ошибок undefined сокращается. Обратите внимание, что вам, вероятно, не нужно будет добавлять каждую библиотеку, потому что некоторые могут быть загружены как зависимости для тех, которые вы явно добавили.

Если вы не знаете, где находится 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)

Также прочитайте лицензию библиотеки, на которую вы ссылаетесь.

Ответ 5

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

STEP1: создание файлов

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

STEP2: создайте lib

gcc -c myfunc1.c myfunc2.c

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

STEP3: ссылка

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

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

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