Menyusun masalah: tidak dapat menemukan crt1.o


114

Saya memiliki sistem Debian virtual yang saya gunakan untuk mengembangkan.

Hari ini saya ingin mencoba llvm / clang.

Setelah menginstal clang saya tidak dapat mengkompilasi c-proyek lama saya (dengan gcc). Ini adalah kesalahannya:

...
/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
...

Saya mencopot pemasangan dentang dan tetap tidak berhasil.

Apakah ada yang tahu bagaimana saya bisa memperbaikinya?


6
Coba instal libc0.1-dev.
Michas



Ini adalah BUG yang dilaporkan dalam launchpad, namun ada solusinya: askubuntu.com/questions/251978/…
Roman

Jawaban:


91

Debian / Ubuntu

Masalahnya adalah kemungkinan besar Anda hanya memiliki gcc untuk arsitektur Anda saat ini dan itu 64bit. Anda membutuhkan file dukungan 32bit. Untuk itu, Anda perlu menginstalnya

sudo apt install gcc-multilib

2
Di Ubuntu ini berhasil sudo apt-get install gcc-multilibdan memperbaiki kesalahan saya darigfortran -m32 ...
randwa1k

1
Pertanyaan yang lebih spesifik yang menyebutkan penyebab 64 vs 32: stackoverflow.com/questions/21724540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

62

Yang membantu saya adalah membuat tautan simbolis:

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

5
Ini berhasil, namun ini memberi Anda secara efektif hanya satu lengkungan pada multiarch Debian.
Jeremiah

2
Saya memiliki masalah yang sama saat mencoba menyiapkan toolchain kompilasi silang yang diberikan seseorang kepada saya sebagai bundel tar. Saya harus menggunakan strace (yaitu "strace gcc <all my arguments> 2> & 1 | grep crt1.o") untuk melihat di mana gcc mencari crt1.o, jadi saya bisa mencari tahu tautan simbolik apa yang akan dibuat.
Andrew Bainbridge

37

Tampaknya ketika Anda bermain dengan llvm / clang Anda (atau manajer paket) menghapus paket pengembangan perpustakaan C standar yang ada sebelumnya ( eglibc di Debian) atau mungkin Anda tidak menginstalnya sejak awal, jadi Anda perlu menginstal ulang itu, sekarang Anda kembali ke gcc.

Anda dapat melakukannya seperti ini di Debian:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

Di Ubuntu, jika Anda tidak memiliki libc-dev, karena saya tidak dapat menemukannya di packages.ubuntu.com, Anda dapat mencoba menginstal libc6-dev secara langsung.

Atau pada sistem seperti Redhat:

yum instal glibc-devel

NB: Meskipun Anda dijawab secara singkat di komentar, berikut adalah jawaban agar ada satu yang tercatat jika seseorang menemukan yang ini dan mungkin mencari jawaban, tetapi tidak di komentar atau komentar tersebut tidak cukup eksplisit untuk mereka .


1
Bukan berarti hal-hal multiarch debian merusak banyak build, seringkali dengan kesalahan ini. ekspor LD_LIBRARY_PATH bisa melakukan trik.
deadalnix

3
ini membantu, untuk alpine linuxapk add libc-dev=0.7.1-r0
Yu Jiaao

27

Ini adalah BUG yang dilaporkan di launchpad, tetapi ada solusinya:

Jalankan ini untuk melihat di mana file-file ini berada

$ find /usr/ -name crti*
/usr/lib/x86_64-linux-gnu/crti.o

lalu tambahkan jalur ini ke variabel LIBRARY_PATH

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

Bekerja pada 14.04. Ini adalah rute pilihan jika Anda tidak ingin
mengacaukan

17

Jika Anda menggunakan versi Pengujian Debian, yang disebut 'wheezy', Anda mungkin telah digigit oleh perpindahan ke multiarch. Lebih lanjut tentang multiarch Debian di sini: http://wiki.debian.org/Multiarch

Pada dasarnya, yang terjadi adalah berbagai perpustakaan khusus arsitektur dipindahkan dari tempat tradisional dalam sistem file ke tempat khusus arsitektur baru. Ini sebabnya/usr/bin/ld bingung.

Anda akan menemukan crt1.o di keduanya /usr/lib64/dan /usr/lib/i386-linux-gnu/sekarang dan Anda harus memberi tahu toolchain Anda tentang itu. Berikut beberapa dokumentasi tentang cara melakukannya; http://wiki.debian.org/Multiarch/LibraryPathOverview

Perhatikan bahwa hanya membuat symlink hanya akan memberi Anda satu arsitektur dan pada dasarnya Anda akan menonaktifkan multiarch. Meskipun ini mungkin yang Anda inginkan, mungkin ini bukan solusi yang optimal.


3
Sedikit lebih banyak tentang bagaimana untuk "memberitahu toolchain Anda tentang itu" akan menjadi luar biasa, karena inilah situasi yang saya alami. Terima kasih.
SullX

Pertama, Anda perlu mengetahui arsitektur mana yang Anda bangun. Apakah Anda sedang membangun aplikasi berbasis AMD64? Jika demikian, Anda harus memberi tahu 'ld' di mana file objek bersama berbasis AMD64 berada, yaitu file .o yang Anda perlukan. Jika Anda mengerjakan AMD64, mereka harus berada di / usr / lib64
jeremiah

16

Setelah membaca http://wiki.debian.org/Multiarch/LibraryPathOverview yang dikirim jeremiah, saya menemukan flag gcc yang berfungsi tanpa symlink:

gcc -B/usr/lib/x86_64-linux-gnu hello.c

Jadi, Anda bisa menambahkan -B/usr/lib/x86_64-linux-gnuvariabel CFLAGS di Makefile Anda.


@DjDac Anda seharusnya tidak memerlukan bendera apa pun di Ubuntu 16.04, AFAICT.
alexm

9

Untuk mendapatkan RHEL 7 64-bit untuk mengkompilasi program gcc 4.8 32-bit, Anda perlu melakukan dua hal.

  1. Pastikan semua alat pengembangan 32-bit gcc 4.8 telah diinstal sepenuhnya:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
  2. Kompilasi program menggunakan tanda -m32

    gcc pgm.c -m32 -o pgm

dicuri dari sini: Bagaimana cara Mengkompilasi Aplikasi 32-bit di 64-bit RHEL? - Saya hanya perlu melakukan langkah 1.


6

Seperti yang dijelaskan dalam file crti.o yang hilang , lebih baik gunakan "gcc -print-search-dirs" untuk mengetahui semua jalur pencarian. Kemudian buat link seperti yang dijelaskan di atas "sudo ln -s" untuk menunjuk ke lokasi crt1.o


3

Ini bekerja untuk saya dengan Ubuntu 16.04

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


1

Bertemu ini di CentOs 5.4. Perhatikan bahwa lib64 berisi file crt * .o, tetapi lib tidak. Menginstal glibc-devel melalui yum yang menginstal i386 bits dan ini menyelesaikan masalah saya.


0

Bahkan saya mendapat kesalahan kompilasi yang sama ketika saya melakukan kompilasi silang i686-cm-linux-gcc.

Opsi kompilasi di bawah ini memecahkan masalah saya

$ i686-cm-linux-gcc a.c --sysroot=/opt/toolchain/i686-cm-linux-gcc

Catatan: Sysroot harus menunjuk ke direktori compiler di mana usr / include tersedia

Dalam kasus saya, toolchain diinstal di / opt / toolchain / i686-cm-linux-gcc direktori dan usr / include juga tersedia di direktori yang sama


0

Saya menyelesaikannya sebagai berikut:

1) mencoba untuk menemukan file ctr1.o dan ctri.o dengan menggunakan find -name ctr1.o

Saya mendapatkan yang berikut di komputer saya: $/usr/lib/i386-linux/gnu

2) Tambahkan jalur itu ke PATH(juga LIBRARY_PATH) variabel lingkungan (untuk melihat yang merupakan nama: ketik envperintah di Terminal):

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

Untuk menghindari kebingungan, baris $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH benar-benar:
pac88

0

Saya memiliki masalah yang sama hari ini, saya menyelesaikannya dengan menginstal paket yang direkomendasikan: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

Ini berhasil:

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

-1

Dalam kasus saya, kesalahan crti.o disebabkan oleh konfigurasi jalur eksekusi dari Matlab. Misalnya, Anda tidak dapat menjalankan file jika Anda belum menyetel jalur direktori eksekusi Anda sebelumnya. Untuk melakukan ini: File> setPath, tambahkan direktori Anda dan simpan.



-2

Dalam kasus saya, Ubuntu 16.04saya tidak memiliki crti.osama sekali:

$ find /usr/ -name crti*

Jadi saya menginstal paket pengembang libc 6 -dev:

sudo apt-get install libc6-dev
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.