Derleme sorunları: crt1.o bulunamıyor


115

Geliştirmek için kullandığım sanal bir Debian sistemim var.

Bugün llvm / clang'ı denemek istedim.

Clang'ı kurduktan sonra eski c-projelerimi (gcc ile) derleyemiyorum. Bu hata:

...
/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'ı kaldırdım ve hala işe yaramadı.

Bunu nasıl düzeltebileceğime dair bir fikri olan var mı?


6
Yüklemeyi deneyin libc0.1-dev.
Michas



Bu, launchpad'de bildirilen bir HATA, ancak bir çözüm var: askubuntu.com/questions/251978/…
Roman

Yanıtlar:


91

Debian / Ubuntu

Sorun, muhtemelen mevcut mimariniz için yalnızca gcc'ye sahip olmanız ve bu 64bit olmasıdır. 32bit destek dosyalarına ihtiyacınız var. Bunun için onları kurmanız gerekiyor

sudo apt install gcc-multilib

2
Ubuntu'da bu işe yaradı sudo apt-get install gcc-multilibve gfortran -m32 ...
hatamı düzeltti


62

Bana yardımcı olan şey sembolik bir bağlantı oluşturmaktı:

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

5
Bu işe yarıyor, ancak size Debian multiarch üzerinde etkin bir şekilde sadece bir ark sağlıyor.
jeremiah

2
Birinin bana katran paketi olarak verdiği çapraz derleme araç zincirini kurmaya çalışırken aynı problemi yaşadım. Gcc'nin crt1.o'yu nerede aradığını görmek için strace (yani "strace gcc <all my arguments> 2> & 1 | grep crt1.o") kullanmam gerekiyordu, böylece hangi sembolik bağlantıyı oluşturacağımı bulabilirdim.
Andrew Bainbridge

37

Görünüşe göre llvm / clang ile oynarken (veya paket yöneticisi) önceden var olan standart C kütüphanesi geliştirme paketini ( Debian'da eglibc ) kaldırdınız veya belki de ilk başta onu yüklemediniz, bu yüzden yeniden yüklemeniz gerekiyor artık gcc'ye geri döndüğünüze göre.

Bunu Debian'da böyle yapabilirsiniz:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

Ubuntu'da libc-dev'iniz yoksa, bunu packages.ubuntu.com'da bulamadığım için, doğrudan libc6-dev'i kurmayı deneyebilirsiniz.

Veya Redhat benzeri sistemlerde:

yum yüklemek glibc-devel

Not: Yorumlarda kısaca yanıtlanmış olmanıza rağmen, burada bir cevap var, biri bununla karşılaştığında bir cevap arıyor olabilir, ancak yorumlarda değil veya yorum onlar için yeterince açık değil .


1
Debian'ın multiarch öğesi, çoğu zaman bu hatayla çok fazla yapıyı bozmaz. dışa aktar LD_LIBRARY_PATH hile yapabilir.
deadalnix

3
Alpin linux için bu yardımcı olurapk add libc-dev=0.7.1-r0
Yu Jiaao

27

Bu, başlatma çubuğunda bildirilen bir HATA , ancak bir çözüm var:

Bu dosyaların nerede olduğunu görmek için bunu çalıştırın

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

daha sonra bu yolu LIBRARY_PATH değişkenine ekleyin

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

14.04. Sisteminizin kitaplıklarını karıştırmak istemiyorsanız tercih ettiğiniz yol
budur

17

Debian'ın 'Wheezy' adı verilen Test sürümünü kullanıyorsanız, multiarch'a geçtiğinizde ısırılmış olabilirsiniz. Debian'ın multiarch hakkında daha fazla bilgiyi burada bulabilirsiniz: http://wiki.debian.org/Multiarch

Temel olarak, çeşitli mimariye özgü kitaplıkların dosya sistemindeki geleneksel yerlerden yeni mimariye özgü yerlere taşınmasıdır. Bu yüzden /usr/bin/ldkafası karışıyor.

Crt1.o'yu her ikisinde de bulacaksınız /usr/lib64/ve /usr/lib/i386-linux-gnu/şimdi araç zincirinize bundan bahsetmeniz gerekecek. İşte bunun nasıl yapılacağına dair bazı belgeler; http://wiki.debian.org/Multiarch/LibraryPathOverview

Yalnızca bir sembolik bağ oluşturmanın size yalnızca bir mimari vereceğini ve aslında multiarch'ı devre dışı bırakacağınızı unutmayın. İstediğiniz bu olsa da, en uygun çözüm olmayabilir.


3
"Alet zincirinize bundan nasıl bahsedeceğiniz" konusunda biraz daha fazla bilgi harika olurdu, çünkü tam olarak içinde bulunduğum durum bu. Teşekkürler.
SullX

İlk olarak, hangi mimari için inşa ettiğinizi bilmeniz gerekir. AMD64 tabanlı bir uygulama mı oluşturuyorsunuz? Öyleyse, AMD64 tabanlı paylaşılan nesne dosyalarının, yani ihtiyacınız olan .o dosyalarının nerede olduğunu 'ld'ye söylemeniz gerekir. Bir AMD64 üzerinde çalışıyorsanız, / usr / lib64 içinde olmalıdır
jeremiah

16

Jeremiah'ın yayınladığı http://wiki.debian.org/Multiarch/LibraryPathOverview'u okuduktan sonra , sembolik bağlantı olmadan çalışan gcc bayrağını buldum:

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

Böylece, -B/usr/lib/x86_64-linux-gnuMakefile dosyanızdaki CFLAGS değişkenine ekleyebilirsiniz .


@DjDac Ubuntu 16.04, AFAICT'de herhangi bir bayrağa ihtiyacınız olmamalıdır.
alexm

9

RHEL 7 64-bit'i gcc 4.8 32-bit programları derlemek için almak için iki şey yapmanız gerekir.

  1. Tüm 32 bit gcc 4.8 geliştirme araçlarının tamamen yüklendiğinden emin olun:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
  2. -M32 bayrağını kullanarak programları derleyin

    gcc pgm.c -m32 -o pgm

buradan çalındı: 32-bit Uygulamalar 64-bit RHEL'de Nasıl Derlenir? - Sadece 1. adımı yapmak zorundaydım.


6

Eksik crti.o dosyasında açıklandığı gibi , tüm arama yolunu bulmak için "gcc -print-search-dirs" kullanmak daha iyidir. Ardından crt1.o'nun konumuna işaret etmek için yukarıda açıklandığı gibi bir bağlantı oluşturun "sudo ln -s"


3

Bu benim için Ubuntu 16.04 ile çalıştı

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


1

Bununla CentOs 5.4'te karşılaştım. Lib64'ün crt * .o dosyalarını içerdiğini ancak lib'in içermediğini fark ettim. İ386 bitlerini yükleyen yum aracılığıyla glibc-devel yüklendi ve bu sorunumu çözdü.


0

Hatta i686-cm-linux-gcc'yi çapraz derlerken aynı derleme hatasını aldım.

Aşağıdaki derleme seçeneği sorunumu çözdü

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

Not: Sysroot , usr / include'in mevcut olduğu derleyici dizinini göstermelidir.

Benim durumumda, araç zinciri / opt / toolchain / i686-cm-linux-gcc dizinine kurulur ve usr / include da aynı dizinde bulunur


0

Bunu şu şekilde çözdüm:

1) kullanarak ctr1.o ve ctri.o dosyalarını bulmaya çalışın find -name ctr1.o

Bilgisayarımda aşağıdakiler var: $/usr/lib/i386-linux/gnu

2) Bu yolu PATH(ayrıca LIBRARY_PATH) ortam değişkenine ekleyin ( adın hangisi olduğunu görmek enviçin Terminal'de komut yazın):

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

Karışıklıkları önlemek için $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH satırı gerçekten:
satırı pac88

0

Bugün de aynı sorunu yaşadım, önerilen paketleri yükleyerek çözdüm : libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

Bu işe yaradı:

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

-1

Benim durumumda, crti.o hatası, Matlab'ın yürütme yolu yapılandırmasından kaynaklandı. Örneğin, yürütme dizininizin yolunu daha önce ayarlamadıysanız bir dosya gerçekleştiremezsiniz. Bunu yapmak için: File> setPath, dizininizi ekleyin ve kaydedin.



-2

Benim durumumda Ubuntu 16.04hiç yok crti.o:

$ find /usr/ -name crti*

Bu yüzden geliştirici libc 6 -dev paketini kuruyorum:

sudo apt-get install libc6-dev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.