Problemy z kompilacją: nie można znaleźć crt1.o

114

Mam wirtualny system Debian, którego używam do tworzenia.

Dzisiaj chciałem spróbować llvm / clang.

Po zainstalowaniu clang nie mogę skompilować moich starych projektów c (z gcc). To jest błąd:

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

Odinstalowałem clang i nadal nie działało.

Czy ktoś ma pomysł, jak mogę to naprawić?

Stefana Kellera
źródło
6
Spróbuj zainstalować libc0.1-dev.
Michas
1
W przypadku komputerów Mac zobacz: stackoverflow.com/questions/1365211/…
kenorb Kwietnia
możliwy duplikat Missing crt1 i crti podczas crosscompiling
user2284570
To jest BŁĄD zgłoszony w starterze, ale istnieje obejście: askubuntu.com/questions/251978/ ...
Roman

Odpowiedzi:

91

Debian / Ubuntu

Problem polega na tym, że prawdopodobnie masz tylko gcc dla swojej obecnej architektury i jest to 64-bitowe. Potrzebujesz 32-bitowych plików pomocniczych. W tym celu musisz je zainstalować

sudo apt install gcc-multilib
Dmitry Pavlenko
źródło
2
W Ubuntu to zadziałało sudo apt-get install gcc-multilibi naprawiło mój błąd zgfortran -m32 ...
randwa1k
1
Bardziej szczegółowe pytanie, które wspomina przyczynę 64 na 32: stackoverflow.com/questions/21724540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
62

Pomogło mi utworzenie dowiązania symbolicznego:

sudo ln -s /usr/lib/x86_64-linux-gnu /usr/lib64
Karel Lenc
źródło
5
To działa, ale daje efektywnie tylko jeden łuk na multiarchę Debiana.
jeremiah
2
Miałem ten sam problem, próbując skonfigurować cross-kompilujący zestaw narzędzi, który ktoś mi dał jako pakiet tar. Musiałem użyć strace (tj. "Strace gcc <wszystkie moje argumenty> 2> & 1 | grep crt1.o"), aby zobaczyć, gdzie gcc szukało crt1.o, więc mogłem dowiedzieć się, jakie dowiązanie symboliczne utworzyć.
Andrew Bainbridge,
37

Wygląda na to, że podczas gry z llvm / clang (lub menedżer pakietów) usunąłeś wcześniej istniejący standardowy pakiet deweloperski biblioteki C ( eglibc na Debianie) lub może nie miałeś go zainstalowanego w pierwszej kolejności, więc musisz przeinstalować it, teraz, gdy wróciłeś do gcc.

Możesz to zrobić w ten sposób na Debianie:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

W systemie Ubuntu, jeśli nie masz libc-dev, ponieważ nie mogę go znaleźć na packages.ubuntu.com, możesz spróbować bezpośrednio zainstalować libc6-dev.

Lub w systemach typu Redhat:

yum install glibc-devel

NB: Chociaż w komentarzach udzielono Ci krótkiej odpowiedzi, oto odpowiedź, więc jest jedna zapisana na wypadek, gdyby ktoś ją spotkał i mógł szukać odpowiedzi, ale nie w komentarzach lub komentarz nie jest dla niego wystarczająco wyraźny .

Shinnok
źródło
1
Nie chodzi o to, że multiarchalne rzeczy w Debianie psują wiele kompilacji, często z tym błędem. eksport LD_LIBRARY_PATH może załatwić sprawę.
deadalnix
3
to pomaga, dla linuxa alpejskiegoapk add libc-dev=0.7.1-r0
Yu Jiaao
27

To jest BŁĄD zgłoszony w starterze, ale istnieje obejście:

Uruchom to, aby zobaczyć, gdzie znajdują się te pliki

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

następnie dodaj tę ścieżkę do zmiennej LIBRARY_PATH

$ export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LIBRARY_PATH
Umair R.
źródło
Działa 14.04.2020 Jest to preferowana trasa, jeśli nie chcesz
zmieniać
17

Jeśli używasz wersji testowej Debiana, zwanej „wheezy”, być może ugryzło Cię przejście na multiarchę. Więcej na temat multiarch Debiana tutaj: http://wiki.debian.org/Multiarch

Zasadniczo dzieje się tak, że różne biblioteki specyficzne dla architektury są przenoszone z tradycyjnych miejsc w systemie plików do miejsc specyficznych dla nowej architektury. Dlatego /usr/bin/ldjest zdezorientowany.

Znajdziesz crt1.o w obu /usr/lib64/i /usr/lib/i386-linux-gnu/teraz i będziesz musiał powiedzieć o tym swojemu toolchainowi. Oto dokumentacja, jak to zrobić; http://wiki.debian.org/Multiarch/LibraryPathOverview

Zauważ, że samo utworzenie dowiązania symbolicznego da ci tylko jedną architekturę i zasadniczo wyłączysz multiarchę. Chociaż może to być to, czego chcesz, może to nie być optymalne rozwiązanie.

jeremiah
źródło
3
Nieco więcej na temat tego, jak „powiedzieć o tym swojemu łańcuchowi narzędzi” byłoby fantastyczne, ponieważ dokładnie w takiej sytuacji się znajduję. Dzięki.
SullX
Po pierwsze, musisz wiedzieć, dla jakiej architektury tworzysz. Czy tworzysz aplikację opartą na AMD64? Jeśli tak, musisz powiedzieć „ld”, gdzie znajdują się współdzielone pliki obiektów opartych na AMD64, tj. Pliki .o, których potrzebujesz. Jeśli pracujesz na AMD64 powinni być w / usr / lib64
Jeremiah
16

Po przeczytaniu http://wiki.debian.org/Multiarch/LibraryPathOverview opublikowanego przez jeremiaha znalazłem flagę gcc, która działa bez linku symbolicznego:

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

Więc możesz po prostu dodać -B/usr/lib/x86_64-linux-gnudo zmiennej CFLAGS w swoim Makefile.

alexm
źródło
@DjDac nie powinieneś potrzebować żadnej flagi w Ubuntu 16.04, AFAICT.
alexm
9

Aby uzyskać 64-bitową wersję RHEL 7 do kompilacji 32-bitowych programów gcc 4.8, musisz zrobić dwie rzeczy.

  1. Upewnij się, że wszystkie 32-bitowe narzędzia programistyczne gcc 4.8 są całkowicie zainstalowane:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
  2. Kompiluj programy przy użyciu opcji -m32

    gcc pgm.c -m32 -o pgm

skradzione stąd: Jak skompilować 32-bitowe aplikacje na 64-bitowym RHEL? - Musiałem zrobić tylko krok 1.

brutalny
źródło
6

Jak wyjaśniono w brakującym pliku crti.o , lepiej jest użyć polecenia „gcc -print-search-dirs”, aby znaleźć całą ścieżkę wyszukiwania. Następnie utwórz łącze, jak wyjaśniono powyżej "sudo ln -s", aby wskazać lokalizację crt1.o

tienping
źródło
3

To działało dla mnie z Ubuntu 16.04

$ LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
$ export LIBRARY_PATH
Niklas R.
źródło
3

./configure --disable-multilib

działa na to

Chunyang Kwok
źródło
1

Wpadłem na to w CentOs 5.4. Zauważyłem, że lib64 zawierało pliki crt * .o, ale lib nie zawierało. Zainstalowałem glibc-devel przez yum, który zainstalował bity i386 i to rozwiązało mój problem.

Shrinivas
źródło
0

Nawet dostałem ten sam błąd kompilacji, kiedy kompilowałem krzyżowo i686-cm-linux-gcc.

Poniższa opcja kompilacji rozwiązała mój problem

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

Uwaga: sysroot powinien wskazywać katalog kompilatora, w którym dostępne są usr / include

W moim przypadku toolchain jest zainstalowany w katalogu / opt / toolchain / i686-cm-linux-gcc, a usr / include jest również dostępny w tym samym katalogu

Bhagawanie
źródło
0

Rozwiązałem to w następujący sposób:

1) spróbuj zlokalizować pliki ctr1.o i ctri.o przy użyciu find -name ctr1.o

W moim komputerze mam następujące informacje: $/usr/lib/i386-linux/gnu

2) Dodaj tę ścieżkę do PATH(również LIBRARY_PATH) zmiennej środowiskowej (aby zobaczyć, jaka jest nazwa: wpisz envpolecenie w terminalu):

$PATH=/usr/lib/i386-linux/gnu:$PATH
$export PATH
pac88
źródło
Aby uniknąć nieporozumień, wiersz $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH to tak naprawdę:
pac88
0

Miałem dzisiaj ten sam problem, rozwiązałem go instalując zalecane pakiety: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

To zadziałało:

sudo apt-get install libc6-dev-mipsel-cross
krusty
źródło
-1

W moim przypadku błąd crti.o był spowodowany konfiguracją ścieżki wykonania z Matlaba. Na przykład nie można wykonać pliku, jeśli wcześniej nie ustawiono ścieżki katalogu wykonywania. Aby to zrobić: Plik> setPath, dodaj swój katalog i zapisz.

Kuro
źródło
-1

posługiwać się gcc -B lib_path_containing_crt?.o

James Chan
źródło
-2

W moim przypadku w ogóle Ubuntu 16.04nie mam crti.o:

$ find /usr/ -name crti*

Więc instaluję pakiet deweloperski libc 6 -dev:

sudo apt-get install libc6-dev
Eugen Konkov
źródło