Sự cố biên dịch: không thể tìm thấy crt1.o


114

Tôi có một hệ thống Debian ảo mà tôi sử dụng để phát triển.

Hôm nay tôi muốn thử llvm / clang.

Sau khi cài đặt clang, tôi không thể biên dịch c-project cũ của mình (với gcc). Đây là lỗi:

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

Tôi đã gỡ cài đặt tiếng kêu và nó vẫn không hoạt động.

Có ai có bất kỳ ý tưởng làm thế nào tôi có thể sửa chữa điều này?


6
Thử cài đặt libc0.1-dev.
Michas

1
Đối với Mac, hãy xem: stackoverflow.com/questions/1365211/…
kenorb,


Đây là một BUG được báo cáo trong bảng khởi chạy, tạm thời có một cách giải quyết: askubuntu.com/questions/251978/…
Roman

Câu trả lời:


91

Debian / Ubuntu

Vấn đề là bạn có thể chỉ có gcc cho kiến ​​trúc hiện tại của mình và đó là 64bit. Bạn cần các tệp hỗ trợ 32 bit. Để làm được điều đó, bạn cần cài đặt chúng

sudo apt install gcc-multilib

2
Trên Ubuntu này làm việc sudo apt-get install gcc-multilibvà nó cố định lỗi của tôi từgfortran -m32 ...
randwa1k

1
Câu hỏi cụ thể hơn đề cập đến nguyên nhân 64 vs 32: stackoverflow.com/questions/21724540/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

62

Điều đã giúp tôi là tạo ra một liên kết tượng trưng:

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

5
Điều này có hiệu quả, tuy nhiên, nó chỉ mang lại cho bạn một cách hiệu quả trên đa tìm kiếm Debian.
jeremiah

2
Tôi đã gặp vấn đề tương tự khi cố gắng thiết lập chuỗi công cụ biên dịch chéo mà ai đó đã cho tôi làm gói tar. Tôi phải sử dụng strace (tức là "strace gcc <tất cả các đối số của tôi> 2> & 1 | grep crt1.o") để xem nơi gcc đang tìm kiếm crt1.o, vì vậy tôi có thể tìm ra liên kết tượng trưng nào cần tạo.
Andrew Bainbridge

37

Có vẻ như trong khi chơi với llvm / clang, bạn (hoặc người quản lý gói) đã gỡ bỏ gói phát triển thư viện C chuẩn đã tồn tại trước đó ( ví dụ :libc trên Debian) hoặc có thể bạn chưa cài đặt nó ngay từ đầu, do đó bạn cần phải cài đặt lại nó, bây giờ bạn đã hoàn nguyên trở lại gcc.

Bạn có thể làm như vậy trên Debian:

aptitude show libc-dev

Ubuntu:

apt-get install libc-dev

Trên Ubuntu, nếu bạn không có libc-dev, vì tôi không thể tìm thấy nó trên package.ubuntu.com, bạn có thể thử cài đặt libc6-dev trực tiếp.

Hoặc trên hệ thống Redhat như:

yum cài đặt glibc-devel

NB: Mặc dù bạn đã được trả lời ngắn gọn trong các bình luận, nhưng đây là một câu trả lời chỉ để có một câu trả lời trong trường hợp ai đó gặp câu hỏi này và có thể đang tìm kiếm câu trả lời, nhưng không có trong các bình luận hoặc bình luận không đủ rõ ràng cho họ .


1
Không phải công cụ đa tìm kiếm của debian phá vỡ nhiều bản dựng, thường xảy ra lỗi này. xuất LD_LIBRARY_PATH có thể thực hiện thủ thuật.
deadalnix,

3
điều này giúp, cho alpine linuxapk add libc-dev=0.7.1-r0
Yu Jiaao

27

Đây là một BUG được báo cáo trong bảng khởi chạy, nhưng có một cách giải quyết:

Chạy cái này để xem các tệp này nằm ở đâu

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

sau đó thêm đường dẫn này vào biến LIBRARY_PATH

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

Hoạt động trên 14.04. Đây là lộ trình ưa thích nếu bạn không muốn làm hỏng các thư viện trong hệ thống của mình
BobTuckerman,

17

Nếu bạn đang sử dụng phiên bản Thử nghiệm của Debian, được gọi là 'wheezy', thì bạn có thể đã bị ảnh hưởng bởi việc chuyển sang đa tìm kiếm. Tìm hiểu thêm về multiarch của Debian tại đây: http://wiki.debian.org/Multiarch

Về cơ bản, những gì đang xảy ra là các thư viện kiến ​​trúc cụ thể khác nhau đang được chuyển từ những nơi truyền thống trong hệ thống tệp sang những nơi cụ thể về kiến ​​trúc mới. Đây là lý do tại sao/usr/bin/ld bị nhầm lẫn.

Bạn sẽ tìm thấy crt1.o trong cả hai /usr/lib64//usr/lib/i386-linux-gnu/bây giờ và bạn sẽ cần nói với chuỗi công cụ của mình về điều đó. Đây là một số tài liệu về cách thực hiện điều đó; http://wiki.debian.org/Multiarch/LibraryPathOverview

Lưu ý rằng chỉ tạo một liên kết tượng trưng sẽ chỉ cung cấp cho bạn một kiến trúc và về cơ bản bạn sẽ vô hiệu hóa tính năng đa tìm kiếm. Mặc dù đây có thể là điều bạn muốn nhưng nó có thể không phải là giải pháp tối ưu.


3
Thêm một chút về cách "nói với chuỗi công cụ của bạn về điều đó" sẽ rất tuyệt vời, vì đây chính xác là tình huống tôi đang gặp phải. Cảm ơn.
SullX

Đầu tiên, bạn cần biết bạn đang xây dựng cho kiến ​​trúc nào. Bạn đang xây dựng một ứng dụng dựa trên AMD64? Nếu vậy, bạn sẽ cần phải cho 'ld' biết vị trí của các tệp đối tượng được chia sẻ dựa trên AMD64, tức là các tệp .o bạn cần. Nếu bạn đang làm việc trên AMD64, chúng sẽ ở trong / usr / lib64
jeremiah

16

Sau khi đọc http://wiki.debian.org/Multiarch/LibraryPathOverview mà jeremiah đã đăng, tôi thấy cờ gcc hoạt động mà không có liên kết biểu tượng:

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

Vì vậy, bạn chỉ có thể thêm -B/usr/lib/x86_64-linux-gnuvào biến CFLAGS trong Makefile của mình.


@DjDac bạn sẽ không cần bất kỳ cờ nào trong Ubuntu 16.04, AFAICT.
alexm

9

Để có RHEL 7 64-bit để biên dịch các chương trình gcc 4.8 32-bit, bạn sẽ cần thực hiện hai việc.

  1. Đảm bảo rằng tất cả các công cụ phát triển 32-bit gcc 4.8 đã được cài đặt hoàn chỉnh:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
  2. Biên dịch chương trình bằng cờ -m32

    gcc pgm.c -m32 -o pgm

bị đánh cắp từ đây: Cách biên dịch ứng dụng 32-bit trên RHEL 64-bit? - Tôi chỉ phải làm bước 1.


6

Như đã giải thích trong phần thiếu tệp crti.o , tốt hơn nên sử dụng "gcc -print-search-dirs" để tìm ra tất cả đường dẫn tìm kiếm. Sau đó, tạo một liên kết như giải thích ở trên "sudo ln -s" để trỏ đến vị trí của crt1.o


3

Điều này làm việc cho tôi với Ubuntu 16.04

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


1

Xếp hạng này trên CentOs 5.4. Nhận thấy rằng lib64 chứa các tệp crt * .o, nhưng lib thì không. Đã cài đặt glibc-devel thông qua yum đã cài đặt các bit i386 và điều này đã giải quyết được sự cố của tôi.


0

Ngay cả khi tôi cũng gặp lỗi biên dịch tương tự khi biên dịch chéo i686-cm-linux-gcc.

Tùy chọn biên dịch bên dưới đã giải quyết vấn đề của tôi

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

Lưu ý: Sysroot phải trỏ đến thư mục trình biên dịch nơi có sẵn usr / include

Trong trường hợp của tôi, chuỗi công cụ được cài đặt tại thư mục / opt / toolchain / i686-cm-linux-gcc và usr / include cũng có sẵn trong cùng thư mục


0

Tôi đã giải quyết nó như sau:

1) cố gắng định vị các tệp ctr1.o và ctri.o bằng cách sử dụng find -name ctr1.o

Tôi có những thứ sau trong máy tính của mình: $/usr/lib/i386-linux/gnu

2) Thêm đường dẫn đó vào PATH(cũng LIBRARY_PATH) biến môi trường (để xem đó là tên: gõ envlệnh trong Terminal):

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

Để tránh những rắc rối, dòng $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH thực sự là:
pac88

0

Tôi đã gặp vấn đề tương tự hôm nay, tôi đã giải quyết nó bằng cách cài đặt các gói được đề xuất: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

Điều này đã hoạt động:

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

-1

Trong trường hợp của tôi, lỗi crti.o do cấu hình đường dẫn thực thi từ Matlab. Ví dụ: bạn không thể thực hiện một tệp nếu bạn chưa đặt đường dẫn của thư mục thực thi của mình trước đó. Để thực hiện việc này: File> setPath, thêm thư mục của bạn và lưu.



-2

Trong trường hợp của Ubuntu 16.04tôi, tôi không có crti.o:

$ find /usr/ -name crti*

Vì vậy, tôi cài đặt gói developer libc 6 -dev:

sudo apt-get install libc6-dev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.