Проблемы с компиляцией: не могу найти crt1.o - PullRequest
99 голосов
/ 13 июня 2011

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

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

Ответы [ 17 ]

73 голосов
/ 15 апреля 2013

Debian / Ubuntu

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

sudo apt install gcc-multilib
60 голосов
/ 25 января 2012

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

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
33 голосов
/ 11 июля 2011

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

25 голосов
/ 17 мая 2013

Это 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
17 голосов
/ 19 июня 2012

Если вы используете версию тестирования 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. Хотя это может быть тем, что вам нужно, это не может быть оптимальным решением.

13 голосов
/ 12 сентября 2012

После прочтения 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.

8 голосов
/ 16 августа 2016

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

5 голосов
/ 22 января 2013

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

3 голосов
/ 18 декабря 2017

. / Configure --disable-multilib

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

1 голос
/ 31 марта 2017

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

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
...