Проблемы с компиляцией: не удается найти crt1.o
У меня есть виртуальная система Debian, которую я использую для разработки.
Сегодня я хотел попробовать llvm / clang.
После установки clang я не могу скомпилировать свои старые c-проекты (с gcc). Это ошибка:
- LD_LIBRARY_PATH против LIBRARY_PATH
- GNU gcc / ld - завершение вызова символа с вызывающим и вызываемым, определенным в том же объектном файле
- Каковы параметры командной строки --start-group и -end-group?
- Почему порядок «-l» в gcc имеет значение?
- ld: библиотека не найдена для -lcrt0.o на OSX 10.6 с gcc / clang -статическим флагом
... /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 и все еще не работал.
Кто-нибудь знает, как я могу это исправить?
- Почему я получаю ошибку gcc «undefined reference», пытающуюся создать общие объекты?
- Я не понимаю -Wl, -rpath -Wl,
- В чем разница между -rpath и -L?
- Получить начальный и конечный адрес текстового раздела в исполняемом файле
- объединить два GCC скомпилированных .o объектных файлов в третий файл .o
- Включить двоичный файл с помощью скрипта GNU ld linker
- Как удалить неиспользуемые символы C / C ++ с помощью GCC и ld?
- dlopen из памяти?
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, вам нужно сделать две вещи.
-
Убедитесь, что все 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? – Я только должен был сделать первый шаг.
Как объясняется в файле 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