У меня есть виртуальная система 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, но он все еще не работал.
Кто-нибудь знает, как я могу это исправить?
libc0.1-dev
.Ответы:
Debian / Ubuntu
Проблема в том, что у вас, вероятно, есть только gcc для вашей текущей архитектуры, а это 64-битная версия. Вам нужны 32-битные файлы поддержки. Для этого вам необходимо установить их
источник
sudo apt-get install gcc-multilib
и исправило мою ошибку отgfortran -m32 ...
Мне помогло создание символической ссылки:
источник
Похоже, что пока вы играли с llvm / clang, вы (или менеджер пакетов) удалили ранее существовавший стандартный пакет разработки библиотеки C (например, libc в Debian) или, возможно, у вас его не было изначально, поэтому вам нужно переустановить это, теперь, когда вы вернулись к gcc.
В Debian это можно сделать так:
Ubuntu:
В Ubuntu, если у вас нет libc-dev, поскольку я не могу найти его на packages.ubuntu.com, вы можете попробовать установить libc6-dev напрямую.
Или в системах типа Redhat:
NB: Хотя вам кратко ответили в комментариях, вот ответ, так что он есть в записи на случай, если кто-то столкнется с этим и, возможно, будет искать ответ, но не в комментариях, или комментарий недостаточно явный для них ,
источник
apk add libc-dev=0.7.1-r0
Об этой ОШИБКЕ сообщается на панели запуска, но есть обходной путь:
Запустите это, чтобы увидеть, где находятся эти файлы
затем добавьте этот путь к переменной LIBRARY_PATH
источник
Если вы используете тестовую версию 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Обратите внимание, что простое создание символической ссылки даст вам только одну архитектуру, и вы по существу отключите мультиархитектуру. Хотя это может быть то, что вам нужно, это не может быть оптимальным решением.
источник
Прочитав http://wiki.debian.org/Multiarch/LibraryPathOverview , опубликованный Джеремией, я обнаружил флаг gcc, который работает без символической ссылки:
Итак, вы можете просто добавить
-B/usr/lib/x86_64-linux-gnu
переменную CFLAGS в свой Makefile.источник
Чтобы получить 64-разрядную версию RHEL 7 для компиляции 32-разрядных программ gcc 4.8, вам нужно сделать две вещи.
Убедитесь, что все 32-битные инструменты разработки gcc 4.8 полностью установлены:
Компилировать программы с использованием флага -m32
украдено отсюда: как скомпилировать 32-битные приложения на 64-битном RHEL? - Мне нужно было сделать только шаг 1.
источник
Как объясняется в случае отсутствия файла crti.o , лучше использовать "gcc -print-search-dirs", чтобы узнать весь путь поиска. Затем создайте ссылку, как описано выше, «sudo ln -s», чтобы указать местоположение crt1.o
источник
Это сработало для меня с Ubuntu 16.04
источник
./configure --disable-Multilib
работает на это
источник
Наткнулся на это на CentOs 5.4. Заметил, что lib64 содержит файлы crt * .o, а lib - нет. Установил glibc-devel через yum, который установил биты i386, и это решило мою проблему.
источник
Даже у меня была такая же ошибка компиляции, когда я компилировал i686-cm-linux-gcc.
Приведенный ниже вариант компиляции решил мою проблему
Примечание: sysroot должен указывать на каталог компилятора, где доступен usr / include.
В моем случае набор инструментов установлен в каталоге / opt / toolchain / i686-cm-linux-gcc, и usr / include также доступен в том же каталоге.
источник
Я решил это следующим образом:
1) попробуйте найти файлы ctr1.o и ctri.o с помощью
find -name ctr1.o
У меня на компьютере есть следующее:
$/usr/lib/i386-linux/gnu
2) Добавьте этот путь к
PATH
(такжеLIBRARY_PATH
) переменной окружения (чтобы увидеть, какая команда name: typeenv
в Терминале):источник
Сегодня у меня была такая же проблема, я решил ее, установив рекомендуемые пакеты: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross
Это сработало:
источник
В моем случае ошибка crti.o была вызвана конфигурацией пути выполнения из Matlab. Например, вы не можете выполнить файл, если ранее не указали путь к каталогу выполнения. Для этого: File> setPath, добавьте свой каталог и сохраните.
источник
использовать
gcc -B lib_path_containing_crt?.o
источник
В моем случае у
Ubuntu 16.04
меня вообще нетcrti.o
:Поэтому я устанавливаю пакет разработчика libc 6 -dev:
источник