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

115

У меня есть виртуальная система 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, но он все еще не работал.

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

Стефан Келлер
источник
6
Попробуйте установить libc0.1-dev.
Michas
1
Для Mac см .: stackoverflow.com/questions/1365211/…
kenorb
Об этой ОШИБКЕ сообщается на панели запуска, но есть обходной путь: askubuntu.com/questions/251978/…
Роман

Ответы:

91

Debian / Ubuntu

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

sudo apt install gcc-multilib
Дмитрий Павленко
источник
2
На Ubuntu это сработало sudo apt-get install gcc-multilibи исправило мою ошибку отgfortran -m32 ...
randwa1k
1
Более конкретный вопрос, в котором упоминается причина 64 против 32: stackoverflow.com/questions/21724540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
62

Мне помогло создание символической ссылки:

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
Карел Ленц
источник
5
Это действительно работает, однако фактически дает вам только одну арку на многоархитектурной архитектуре Debian.
Джеремия
2
У меня была такая же проблема при попытке настроить набор инструментов для кросс-компиляции, который кто-то дал мне в виде пакета tar. Мне пришлось использовать strace (например, «strace gcc <all my arguments> 2> & 1 | grep crt1.o»), чтобы увидеть, где gcc ищет crt1.o, чтобы я мог выяснить, какую символическую ссылку создать.
Эндрю Бейнбридж
37

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

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

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

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

Или в системах типа Redhat:

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

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

Шиннок
источник
1
Не то, чтобы многоархивность debian нарушала большую часть сборки, часто с этой ошибкой. export LD_LIBRARY_PATH может сделать трюк.
deadalnix
3
это помогает для alpine linuxapk add libc-dev=0.7.1-r0
Yu Jiaao
27

Об этой ОШИБКЕ сообщается на панели запуска, но есть обходной путь:

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

$ 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
Умайр Р
источник
Работает с 14.04. Это предпочтительный путь, если вы не хотите
портить
17

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

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

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

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

Иеремия
источник
3
Было бы замечательно немного подробнее о том, как «рассказать об этом вашей инструментальной цепочке», поскольку это именно та ситуация, в которой я нахожусь. Спасибо.
SullX 02 авг.13,
Во-первых, вам нужно знать, для какой архитектуры вы строите. Вы создаете приложение на базе AMD64? В таком случае вам нужно указать ld, где находятся общие объектные файлы на базе AMD64, то есть нужные вам файлы .o. Если вы работаете на AMD64 они должны находиться в / USR / lib64
Иер
16

Прочитав 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.

AlexM
источник
@DjDac вам не нужен какой-либо флаг в Ubuntu 16.04, AFAICT.
Алексм
9

Чтобы получить 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.

bulltorious
источник
6

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

tienping
источник
3

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

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
Никлас Р.
источник
3

./configure --disable-Multilib

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

Чуньянг Квок
источник
1

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

Шринивас
источник
0

Даже у меня была такая же ошибка компиляции, когда я компилировал 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 также доступен в том же каталоге.

Бхагаван
источник
0

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

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
pac88
источник
Чтобы избежать путаницы, строка $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH действительно:
pac88
0

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

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

sudo apt-get install libc6-dev-mipsel-cross
Красти
источник
-1

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

Kuro
источник
-1

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

Джеймс Чан
источник
-2

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

$ find /usr/ -name crti*

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

sudo apt-get install libc6-dev
Евгений Коньков
источник