Ответ 1
Что помогло мне создать символическую ссылку:
sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
У меня есть виртуальная система 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 и все еще не работал.
Кто-нибудь знает, как я могу это исправить?
Что помогло мне создать символическую ссылку:
sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
Для меня
aptitude install gcc-multilib
решил аналогичную проблему на Debian.
Кажется, что, когда вы играли с 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: хотя вы были кратко ответили в комментариях, вот ответ, так что есть один на записи, если кто-то встречает этот и может найти ответ, но не в комментариях или комментарий не является явным достаточно для них.
Это 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
Если вы используете версию тестирования 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
Обратите внимание, что просто создание символической ссылки даст вам только одну архитектуру, и вы по существу отключите многоархиво. Хотя это может быть то, что вы хотите, это может быть не оптимальное решение.
После чтения 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.
Как объясняется в файле crti.o, лучше использовать "gcc -print-search-dirs", чтобы узнать весь путь поиска. Затем создайте ссылку, как описано выше "sudo ln -s", чтобы указать на местоположение crt1.o
Чтобы получить 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.
Подходите к этому в CentOs 5.4. Заметил, что lib64 содержит файлы crt *.o, но lib не сделал этого. Установленный glibc-devel через yum, который установил биты i386, и это решило мою проблему.
Даже я получил ту же ошибку компиляции, когда я перекрестно компилировал 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 также доступен в том же каталоге
Это сработало для меня с Ubuntu 16.04
$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
У меня была такая же проблема сегодня, я решил ее, установив рекомендуемые пакеты: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross
Это сработало:
sudo apt-get install libc6-dev-mipsel-cross
./configure --disable-multilib
работает для него
В моем случае ошибка crti.o была связана с конфигурацией пути выполнения от Matlab. Например, вы не можете выполнить файл, если ранее не задавали путь к каталогу выполнения. Для этого: File > setPath, добавьте каталог и сохраните.
использовать gcc -B lib_path_containing_crt?.o
Я решил это следующим образом:
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
В моем случае Ubuntu 16.04
у меня вообще нет crti.o
:
$ find /usr/ -name crti*
Итак, я устанавливаю libc 6 -dev package:
sudo apt-get install libc6-dev