Проблемы с компиляцией: не удается найти 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 и все еще не работал.

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

Ответ 1

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

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

Ответ 2

Для меня

aptitude install gcc-multilib

решил аналогичную проблему на Debian.

Ответ 3

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

Вы можете сделать это на Debian:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

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

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

yum install glibc-devel

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

Ответ 4

Это BUG, сообщаемое в стартовой панели, но есть обходное решение:

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

$ 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

Ответ 5

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
    
  • Скомпилируйте программы, используя флаг -m32

    gcc pgm.c -m32 -o pgm
    

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

Ответ 9

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

Ответ 10

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

Следующий вариант компиляции решил мою проблему

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

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

В моем случае toolchain установлен в каталоге /opt/toolchain/i 686-cm-linux-gcc, а usr/include также доступен в том же каталоге

Ответ 11

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

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

Ответ 12

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

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

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

Ответ 13

./configure --disable-multilib

работает для него

Ответ 14

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

Ответ 15

использовать gcc -B lib_path_containing_crt?.o

Ответ 16

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

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

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

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

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

Ответ 17

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

$ find /usr/ -name crti*

Итак, я устанавливаю libc 6 -dev package:

sudo apt-get install libc6-dev