ld: библиотека не найдена для -lcrt0.o в OSX 10.6 с флагом gcc / clang -static - PullRequest
48 голосов
/ 27 сентября 2010

Когда я пытаюсь собрать следующую программу:

#include <stdio.h>

int main(void)
{
  printf("hello world\n");
  return 0;
}

В OS X 10.6.4 со следующими флагами:

gcc -static -o blah blah.c

Возвращает:

ld: library not found for -lcrt0.o
collect2: ld returned 1 exit status

Кто-нибудь еще сталкивался с этим, или это еще что-то, на кого еще никто не пострадал?Какие-нибудь исправления?

Спасибо

Ответы [ 3 ]

56 голосов
/ 27 сентября 2010

Это не сработает. Со страницы man для gcc:

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

0 голосов
/ 26 февраля 2019

Согласно ответу Нейта, полностью статичное приложение, по-видимому, невозможно - см. Также man ld :

-static Создает файл mach-o, в котором не используется dyld. Используется только для сборки ядра.

Проблема при связывании со статическими библиотеками заключается в том, что, если в одном и том же каталоге находится статическая и динамическая версии библиотеки, динамическая версия будет предпочтительнее. Три способа избежать этого:

  1. Не пытайтесь найти их с помощью опций -L и -l; вместо этого укажите полные пути к библиотекам, которые вы хотите использовать, в командной строке компилятора или компоновщика.

    $ g ++ -Wall -Werror -o hi / usr / local / lib / libboost_unit_test_framework.a hi.cpp

  2. Создайте отдельный каталог, содержащий символические ссылки на статические библиотеки, используйте опцию -L, чтобы сначала выполнить поиск в этом каталоге, и опцию -l, чтобы указать библиотеки, которые вы хотите использовать.

    $ g ++ -Wall -Werror -L ./staticBoostLib -l boost_unit_test_framework -o привет привет.cpp

  3. Вместо создания ссылки с тем же именем в другом каталоге создайте ссылку с другим именем в том же каталоге и укажите это имя в аргументе -l.

    $ g ++ -Wall -Werror -l boost_unit_test_framework_static -o привет привет.cpp

0 голосов
/ 16 сентября 2016

Вы также можете попробовать LLVM LLD linker - я сделал предварительно собранную версию для двух моих основных операционных систем - https://github.com/VerKnowSys/Sofin-llds

Эта позволяет мне ссылаться, например, на "Qemu" - что невозможно с предустановленным ldот Apple.

И последнее - создать GCC самостоятельно с помощью libstdc ++ (не).

...