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?

Stefan Keller
sumber
6
Coba instal libc0.1-dev.
Michas
1
Untuk Mac, lihat: stackoverflow.com/questions/1365211/…
kenorb
kemungkinan duplikat crt1 dan crti yang hilang saat kompilasi silang
pengguna2284570
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
Dmitry Pavlenko
sumber
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
Karel Lenc
sumber
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 .

Shinnok
sumber
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
Umair R
sumber
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.

jeremiah
sumber
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.

alexm
sumber
@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.

bulltorious
sumber
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

tienping
sumber
3

Ini bekerja untuk saya dengan Ubuntu 16.04

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
Niklas R.
sumber
3

./configure --disable-multilib

bekerja untuk itu

Chunyang Kwok
sumber
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.

Shrinivas
sumber
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

Bhagawan
sumber
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
pac88
sumber
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
krusty
sumber
-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.

Kuro
sumber
-1

menggunakan gcc -B lib_path_containing_crt?.o

James Chan
sumber
-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
Eugen Konkov
sumber