Как сделать статическую ссылку на OS X - PullRequest
46 голосов
/ 10 мая 2009

Я пытаюсь подключиться к статической библиотеке в 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, этот параметр бесполезен для большинства людей.

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

Ответы [ 5 ]

53 голосов
/ 11 мая 2009

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

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

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

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

gcc main.o ... /path/to/libfoo.a ...
13 голосов
/ 04 декабря 2009

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

10 голосов
/ 07 января 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)

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

7 голосов
/ 07 августа 2012

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

0 голосов
/ 11 июня 2017

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

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: создать библиотеку

gcc -c myfunc1.c myfunc2.c

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

ШАГ3: ссылка

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...