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

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

Debian / Ubuntu

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

 sudo apt install gcc-multilib 

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

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

Кажется, что, когда вы играли с 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: Хотя вы были кратко ответили в комментариях, вот ответ, так что есть один на записи, если кто-то встречает этот и может искать ответ, но не в комментариях, или комментарий недостаточно ясен для них ,

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

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

 $ 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 здесь: http://wiki.debian.org/Multiarch

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

Вы найдете crt1.o как в /usr/lib64/ и в /usr/lib/i386-linux-gnu/ now, и вам нужно будет рассказать о своей инструментальной цепочке. Вот некоторая документация о том, как это сделать; 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.

Чтобы получить 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? – Я только должен был сделать первый шаг.

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

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

./configure –disable-multilib

работает на него

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

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

 $ i686-cm-linux-gcc ac --sysroot=/opt/toolchain/i686-cm-linux-gcc 

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

В моем случае toolchain установлен в каталоге / opt / toolchain / i686-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 

В моем случае ошибка 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 среды PATH (также LIBRARY_PATH ) (чтобы узнать, какая команда name: env в терминале):

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

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

 $ find /usr/ -name crti* 

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

 sudo apt-get install libc6-dev 
  • ошибка компоновщика при связывании учебника будильника буфера (неопределенные ссылки)
  • CMake: Как установить LDFLAGS в CMakeLists.txt?
  • Давайте будем гением компьютера.