Проблеми зі складанням: не вдається знайти crt1.o


114

У мене є віртуальна система 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
...

Я видалив кланг, і він все ще не працював.

Хтось має уявлення, як я можу це виправити?


6
Спробуйте встановити libc0.1-dev.
Michas



Це помилка, про яку повідомляється в стартовій панелі, але там є рішення: askubuntu.com/questions/251978/…
Роман

Відповіді:


91

Debian / Ubuntu

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

sudo apt install gcc-multilib

2
На Ubuntu це спрацювало, sudo apt-get install gcc-multilibі він виправив мою помилку зgfortran -m32 ...
randwa1k

1
Більш конкретне питання , який згадує 64 проти 32 причини: stackoverflow.com/questions/21724540 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

62

Що мені допомогло - створити символічне посилання:

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

5
Це спрацьовує, однак це дає ефективно лише одну арку на мультиарху Debian.
єремія

2
У мене була така ж проблема, коли я намагався налаштувати ланцюжок інструментів для перекомпіляції, який хтось подав мені як пакет дьогтю. Мені довелося використовувати strace (тобто "strace gcc <всі мої аргументи> 2> & 1 | grep crt1.o"), щоб побачити, де gcc шукає crt1.o, щоб я міг зрозуміти, яке символічне посилання створити.
Ендрю Бейнбрідж

37

Здається, що, граючи з llvm / clang, ви (або менеджер пакунків) видалили раніше існуючий стандартний пакет розробок бібліотеки C (наприклад, libc на Debian), або, можливо, у вас його не встановлено в першу чергу, тому вам потрібно перевстановити тепер, коли ви повернулися до gcc.

Ви можете зробити це так на Debian:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

Якщо у вас немає Ubuntu, якщо у вас немає libc-dev, оскільки я не можу його знайти на Packa.ubuntu.com, можна спробувати встановити libc6-dev безпосередньо.

Або на Redhat як системи:

yum встановити glibc-devel

NB: Хоча вам коротко відповіли в коментарях, ось така відповідь, так що є запис на випадок, якщо хтось стикається з цим і може шукати відповідь, але не в коментарях, або коментар недостатньо явний. .


1
Не те, що мультиархічні речі Debian порушують багато складових, часто з цією помилкою. експорт LD_LIBRARY_PATH може зробити свою справу.
deadalnix

3
це допомагає для альпійського Linuxapk add libc-dev=0.7.1-r0
Ю Цзяао

27

Це помилка, про яку повідомляється в стартовій панелі, але є рішення:

Запустіть це, щоб побачити, де знаходяться ці файли

$ 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

Працює 14.04. Це кращий маршрут, якщо ви не хочете
обробляти

17

Якщо ви використовуєте тестувальну версію Debian, яку називають "wheezy", то вас, можливо, перекусив перехід до мультиарха. Більше про мультиарх Debian тут: http://wiki.debian.org/Multiarch

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

Ви знайдете crt1.o і в /usr/lib64/і /usr/lib/i386-linux-gnu/зараз, і вам потрібно буде повідомити про це свою інструментальну ланцюжок . Ось деяка документація про те, як це зробити; http://wiki.debian.org/Multiarch/LibraryPathOverview

Зауважте, що лише створення символьної посилання дасть вам лише одну архітектуру, і ви, по суті, будете вимкнено багатоархівну роботу. Хоча це може бути те, що ви хочете, це може бути не оптимальним рішенням.


3
Трохи більше про те, як "розповісти про це свою інструментальну ланцюжок", було б фантастично, оскільки це саме така ситуація, в якій я перебуваю. Дякую.
SullX

По-перше, вам потрібно знати, для якої архітектури ви будуєте. Ви будуєте додаток на базі AMD64? Якщо це так, вам потрібно буде сказати 'ld', де знаходяться файли спільного об’єкта на базі AMD64, тобто файли .o, які вам потрібні. Якщо ви працюєте на AMD64 вони повинні знаходитися в / USR / lib64
Єр

16

Прочитавши 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.


@DjDac вам не потрібен будь-який прапор в Ubuntu 16.04, AFAICT.
alexm

9

Щоб отримати RHEL 7 64-розрядний для складання 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.


6

Як пояснено у файлі crti.o, відсутній , краще використовувати "gcc -print-search-dirs", щоб дізнатися весь шлях пошуку. Потім створіть посилання, як пояснено вище "sudo ln -s", щоб вказати на розташування crt1.o




1

Натрапив на це на CentOs 5.4. Помітили, що lib64 містить файли crt * .o, але lib - ні. Встановлено glibc-devel через yum, який встановив i386 біт, і це вирішило мою проблему.


0

Навіть я отримав таку ж помилку компіляції, коли перетинав 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 також доступний у тому самому каталозі


0

Я вирішив це так:

1) спробуйте знайти файли ctr1.o та ctri.o, використовуючи find -name ctr1.o

У мене на комп’ютері є наступне: $/usr/lib/i386-linux/gnu

2) Додайте цей шлях до PATH(також LIBRARY_PATH) змінної середовища (для того, щоб побачити, яка назва: type envкоманда в Терміналі):

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

Щоб уникнути плутанин, рядок $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ експортувати PATH є насправді:
pac88

0

У мене була така ж проблема сьогодні, я вирішив її, встановивши рекомендовані пакети: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

Це спрацювало:

sudo apt-get install libc6-dev-mipsel-cross

-1

У моєму випадку помилка crti.o була спричинена конфігурацією шляху виконання від Matlab. Наприклад, ви не можете виконати файл, якщо раніше ви не встановили шлях до каталогу виконання. Для цього: Файл> setPath, додайте каталог і збережіть.



-2

У моєму випадку Ubuntu 16.04мене взагалі немає crti.o:

$ find /usr/ -name crti*

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

sudo apt-get install libc6-dev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.