Проблемы с компиляцией: не могу найти crt1.o

У меня есть виртуальная система Debian, которую я использую для разработки.

Сегодня я хотел попробовать llvm/clang.

После установки clang я не могу скомпилировать мои старые c-проекты (с помощью gcc). Это ошибка:

...
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
collect2: ld returned 1 exit status
...

Я удалил Clang, и он все еще не работал.

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

21 ответ

Debian / Ubuntu

Проблема в том, что вы, вероятно, имеете только gcc для вашей текущей архитектуры, и это 64-битная версия. Вам нужны 32-битные файлы поддержки. Для этого вам необходимо установить их

sudo apt install gcc-multilib

Что помогло мне создать символическую ссылку:

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64

Кажется, что когда вы играли с llvm / clang, вы (или менеджер пакетов) удалили ранее существующий стандартный пакет разработки библиотеки C (например, libli на Debian) или, возможно, вы не установили его в первую очередь, поэтому вам нужно переустановить это, теперь, когда вы вернулись к GCC.

Вы можете сделать это следующим образом в Debian:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

В Ubuntu, если у вас нет libc-dev, так как я не могу найти его на packages.ubuntu.com, вы можете попробовать установить libc6-dev напрямую.

Или на Redhat как системы:

ням установить glibc-devel

NB. Несмотря на то, что вы получили краткий ответ в комментариях, вот ответ, так что он есть в наличии на случай, если кто-то встретит его и может искать ответ, но не в комментариях, или комментарий не является для них достаточно явным,

Это ошибка, сообщенная в панели запуска, но есть обходной путь:

Запустите это, чтобы увидеть, где находятся эти файлы

$ find /usr/ -name crti*
/usr/lib/x86_64-linux-gnu/crti.o

затем добавьте этот путь в переменную LIBRARY_PATH

$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH

Прочитав http://wiki.debian.org/Multiarch/LibraryPathOverview, опубликованную Иеремией, я обнаружил флаг gcc, который работает без символической ссылки:

gcc -B/usr/lib/x86_64-linux-gnu hello.c

Итак, вы можете просто добавить -B/usr/lib/x86_64-linux-gnu к переменной CFLAGS в вашем Makefile.

Если вы используете версию тестирования Debian, называемую "wheezy", то, возможно, вас укусил переход на multiarch. Подробнее о мультиархе Debian здесь: http://wiki.debian.org/Multiarch

По сути, происходит то, что различные специфичные для архитектуры библиотеки перемещаются из традиционных мест в файловой системе в новые специфические для архитектуры места. Вот почему /usr/bin/ld в замешательстве.

Вы найдете crt1.o в обоих /usr/lib64/ а также /usr/lib/i386-linux-gnu/ сейчас и вам нужно будет рассказать об этом вашему инструментарию. Вот некоторая документация о том, как это сделать; http://wiki.debian.org/Multiarch/LibraryPathOverview

Обратите внимание, что простое создание символической ссылки даст вам только одну архитектуру, и вы по сути отключите multiarch. Хотя это может быть то, что вы хотите, это не может быть оптимальным решением.

Чтобы получить 64-битную версию RHEL 7 для компиляции 32-битных программ gcc 4.8, вам нужно сделать две вещи.

  1. Убедитесь, что все 32-битные средства разработки gcc 4.8 полностью установлены:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
    
  2. Компиляция программ с использованием флага -m32

    gcc pgm.c -m32 -o pgm
    

украдено отсюда: Как скомпилировать 32-битные приложения на 64-битном RHEL? - Я только должен был сделать шаг 1.

Как объясняется в файле crti.o, лучше использовать "gcc -print-search-dirs", чтобы узнать весь путь поиска. Затем создайте ссылку, как описано выше "sudo ln -s", чтобы указать местоположение crt1.o

Это работало для меня с Ubuntu 16.04

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH

./configure --disable-multilib

работает на это

В Alpine Linux это будет означать, что вам нужно :

      apk add musl-dev

Хотя в моем случае сообщения были такими:

      /usr/lib/gcc/x86_64-alpine-linux-musl/11.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find Scrt1.o: No such file or directory
/usr/lib/gcc/x86_64-alpine-linux-musl/11.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find crti.o: No such file or directory
/usr/lib/gcc/x86_64-alpine-linux-musl/11.2.1/../../../../x86_64-alpine-linux-musl/bin/ld: cannot find -lssp_nonshared: No such file or directory
collect2: error: ld returned 1 exit status

Которые также вызваны отсутствиемmusl-dev.

В Alpine Linux вам понадобится пакетlibc-dev

      $ apk add libc-dev

Наткнулся на это на CentOs 5.4. Заметил, что lib64 содержит файлы crt*.o, а lib - нет. Установил glibc-devel через yum, который установил биты i386, и это решило мою проблему.

У меня была та же проблема сегодня, я решил ее, установив рекомендуемые пакеты:libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

Это сработало:

sudo apt-get install libc6-dev-mipsel-cross

Кажется, вы установили кросс-компилятор с помощью менеджера пакетов с помощью--no-install-recommendsвариант, и в результате некоторые пакеты (необходимые для кросс-компиляции) не устанавливаются. Чтобы решить вашу проблему, найдите недостающие файлы на https://packages.debian.org/ , чтобы узнать, какой пакет их предоставляет.

      sudo apt install libc6-dev-arm64-cross libc6-arm64-cross

Даже я получил ту же ошибку компиляции, когда я кросс-компиляции i686-cm-linux-gcc.

Вариант компиляции ниже решил мою проблему

$ i686-cm-linux-gcc a.c --sysroot=/opt/toolchain/i686-cm-linux-gcc

Примечание: sysroot должен указывать на каталог компилятора, где доступен usr / include

В моем случае набор инструментов установлен в каталоге /opt/toolchain/i686-cm-linux-gcc, и usr / include также доступен в этом же каталоге.

Одна волшебная команда:

      sudo apt install build-essential

Мне все починили даже на Raspberry Pi.

Использовать gcc -B lib_path_conisting_crt?.o

Я решил это следующим образом:

1) попробуйте найти файлы ctr1.o и ctri.o, используя find -name ctr1.o

Я получил следующее на моем компьютере: $/usr/lib/i386-linux/gnu

2) Добавьте этот путь к PATH (также LIBRARY_PATH) переменная окружения (чтобы увидеть, какое это имя: тип env команда в Терминале):

$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH

В моем случае ошибка crti.o была вызвана конфигурацией пути выполнения из Matlab. Например, вы не можете выполнить файл, если вы не указали путь к каталогу выполнения ранее. Для этого: File > setPath, добавьте ваш каталог и сохраните.

В моем случае Ubuntu 16.04 У меня нет crti.o совсем:

$ find /usr/ -name crti*

Поэтому я устанавливаю пакет разработчика libc6-dev:

sudo apt-get install libc6-dev
Другие вопросы по тегам