Проблемы с компиляцией: не могу найти 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, вам нужно сделать две вещи.
Убедитесь, что все 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.
Как объясняется в файле 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
В 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.
Я решил это следующим образом:
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