ปัญหาการคอมไพล์: ไม่พบ crt1.o


115

ฉันมีระบบ Debian เสมือนจริงที่ฉันใช้ในการพัฒนา

วันนี้อยากลอง llvm / clang

หลังจากติดตั้งเสียงดังฉันไม่สามารถรวบรวม c-project เก่าของฉัน (ด้วย gcc) นี่คือข้อผิดพลาด:

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

ฉันถอนการติดตั้งเสียงดังลั่น แต่ก็ยังใช้งานไม่ได้

ใครมีความคิดว่าฉันจะแก้ไขปัญหานี้ได้อย่างไร


6
libc0.1-devลองติดตั้ง
Michas

1
สำหรับ Mac โปรดดู: stackoverflow.com/questions/1365211/…
kenorb


นี่คือบั๊กที่รายงานใน Launchpad โดยมีวิธีแก้ปัญหา: askubuntu.com/questions/251978/…
Roman

คำตอบ:


91

Debian / Ubuntu

ปัญหาคือคุณมีเพียง gcc สำหรับสถาปัตยกรรมปัจจุบันของคุณและนั่นคือ 64 บิต คุณต้องการไฟล์รองรับ 32 บิต เพื่อที่คุณจะต้องติดตั้ง

sudo apt install gcc-multilib

2
บน Ubuntu สิ่งนี้ใช้งานได้sudo apt-get install gcc-multilibและแก้ไขข้อผิดพลาดของฉันจากgfortran -m32 ...
randwa1k

1
คำถามเฉพาะเจาะจงมากขึ้นที่กล่าวถึงสาเหตุ 64 vs 32: stackoverflow.com/questions/21724540/…
Ciro Santilli 郝海东冠状病六四事件法轮功

62

สิ่งที่ช่วยฉันคือการสร้างลิงก์สัญลักษณ์:

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

5
วิธีนี้ใช้งานได้ แต่จะให้คุณได้อย่างมีประสิทธิภาพเพียงหนึ่ง arch บน Debian multiarch
เยเรมีย์

2
ฉันมีปัญหาเดียวกันกับการพยายามตั้งค่า toolchain ข้ามคอมไพล์ที่ใครบางคนให้ฉันเป็นชุด tar ฉันต้องใช้ strace (เช่น "strace gcc <all my arguments> 2> & 1 | grep crt1.o") เพื่อดูว่า gcc กำลังมองหา crt1.o ที่ไหนดังนั้นฉันจึงสามารถหาว่าจะสร้างลิงก์สัญลักษณ์ใด
Andrew Bainbridge

37

ดูเหมือนว่าในขณะที่คุณเล่นด้วย llvm / clang คุณ (หรือผู้จัดการแพ็คเกจ) ได้ลบแพ็คเกจการพัฒนาไลบรารี C มาตรฐานที่มีอยู่ก่อนหน้านี้ออก ( eglibcบน Debian) หรือบางทีคุณอาจไม่ได้ติดตั้งไว้ตั้งแต่แรกดังนั้นคุณต้องติดตั้งใหม่ ตอนนี้คุณเปลี่ยนกลับเป็น gcc แล้ว

คุณสามารถทำได้เช่นนี้บน Debian:

aptitude show libc-dev

อูบุนตู:

apt-get install libc-dev

ใน Ubuntu ถ้าคุณไม่มี libc-dev เนื่องจากหาไม่เจอใน package.ubuntu.com คุณสามารถลองติดตั้ง libc6-dev ได้โดยตรง

หรือบน Redhat เช่นระบบ:

ยำติดตั้ง glibc-devel

หมายเหตุ: แม้ว่าคุณจะได้รับคำตอบสั้น ๆ ในความคิดเห็นนี่คือคำตอบดังนั้นจึงมีการบันทึกไว้ในกรณีที่มีคนพบคำถามนี้และอาจกำลังมองหาคำตอบ แต่ไม่อยู่ในความคิดเห็นหรือความคิดเห็นนั้นไม่ชัดเจนเพียงพอสำหรับพวกเขา .


1
ไม่ใช่ว่าสิ่งที่ multiarch ของ debian ทำลายงานสร้างจำนวนมากมักเกิดข้อผิดพลาดนี้ ส่งออก LD_LIBRARY_PATH สามารถทำเคล็ดลับ
deadalnix

3
สิ่งนี้ช่วยได้สำหรับ alpine linuxapk add libc-dev=0.7.1-r0
Yu Jiaao

27

นี่คือBUG ที่รายงานใน Launchpad แต่มีวิธีแก้ไขเบื้องต้น:

เรียกใช้สิ่งนี้เพื่อดูว่าไฟล์เหล่านี้อยู่ที่ใด

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

จากนั้นเพิ่มเส้นทางนี้ไปยังตัวแปร LIBRARY_PATH

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

ทำงานบน 14.04.2018 นี่เป็นเส้นทางที่แนะนำหากคุณไม่ต้องการ
ยุ่ง

17

หากคุณกำลังใช้เวอร์ชันทดสอบของ Debian ที่เรียกว่า 'wheezy' คุณอาจถูกรบกวนจากการย้ายไปที่ multiarch เพิ่มเติมเกี่ยวกับ Multiarch ของ Debian ที่นี่: http://wiki.debian.org/Multiarch

โดยพื้นฐานแล้วสิ่งที่เกิดขึ้นคือไลบรารีเฉพาะสถาปัตยกรรมต่างๆจะถูกย้ายจากที่ดั้งเดิมในระบบไฟล์ไปยังสถานที่เฉพาะสถาปัตยกรรมใหม่ นี่คือสาเหตุที่/usr/bin/ldสับสน

คุณจะพบ crt1.o ในทั้งสอง/usr/lib64/และ/usr/lib/i386-linux-gnu/ตอนนี้และคุณจะต้องบอก toolchain ของคุณเกี่ยวกับเรื่องนั้น นี่คือเอกสารบางส่วนเกี่ยวกับวิธีการดำเนินการ http://wiki.debian.org/Multiarch/LibraryPathOverview

ทราบว่าเป็นเพียงการสร้าง symlink เท่านั้นจะทำให้คุณหนึ่งสถาปัตยกรรมและคุณต้องการจะปิดการใช้งานเป็นหลัก multiarch แม้ว่านี่อาจเป็นสิ่งที่คุณต้องการ แต่ก็อาจไม่ใช่ทางออกที่ดีที่สุด


3
อีกเล็กน้อยเกี่ยวกับวิธี "บอก toolchain ของคุณเกี่ยวกับเรื่องนั้น" จะยอดเยี่ยมมากเพราะนี่เป็นสถานการณ์ที่ฉันอยู่ขอบคุณ
SullX

ประการแรกคุณจะต้องรู้ว่าคุณกำลังสร้างสถาปัตยกรรมใด คุณกำลังสร้างแอปพลิเคชันที่ใช้ AMD64 หรือไม่? ถ้าเป็นเช่นนั้นคุณจะต้องบอก 'ld' ว่าไฟล์ออบเจ็กต์ที่ใช้ร่วมกันของ AMD64 อยู่ที่ไหนนั่นคือไฟล์. o ที่คุณต้องการ หากคุณกำลังทำงานบน AMD64 พวกเขาควรอยู่ใน / usr / lib64
jeremiah

16

หลังจากอ่านhttp://wiki.debian.org/Multiarch/LibraryPath ภาพรวมที่ jeremiah โพสต์ฉันพบแฟล็ก gcc ที่ทำงานโดยไม่มี symlink:

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

ดังนั้นคุณสามารถเพิ่ม-B/usr/lib/x86_64-linux-gnuตัวแปร CFLAGS ใน Makefile ของคุณได้


@DjDac คุณไม่จำเป็นต้องตั้งค่าสถานะใด ๆ ใน Ubuntu 16.04, AFAICT
alexm

9

ในการรับ RHEL 7 64 บิตเพื่อรวบรวมโปรแกรม gcc 4.8 32 บิตคุณจะต้องทำสองสิ่ง

  1. ตรวจสอบให้แน่ใจว่าได้ติดตั้งเครื่องมือการพัฒนา gcc 4.8 32 บิตทั้งหมดแล้ว:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
  2. คอมไพล์โปรแกรมโดยใช้แฟล็ก -m32

    gcc pgm.c -m32 -o pgm

ถูกขโมยไปจากที่นี่: จะรวบรวมแอพ 32 บิตบน 64 บิต RHEL ได้อย่างไร - ฉันต้องทำขั้นตอนที่ 1 เท่านั้น


6

ตามที่อธิบายไว้ในไฟล์ crti.o ที่ขาดหายไปควรใช้ "gcc -print-search-dirs" เพื่อค้นหาเส้นทางการค้นหาทั้งหมด จากนั้นสร้างลิงค์ตามที่อธิบายไว้ด้านบน "sudo ln -s" เพื่อชี้ไปยังตำแหน่งของ crt1.o




1

พบสิ่งนี้ใน CentOs 5.4 สังเกตว่า lib64 มีไฟล์ crt * .o แต่ lib ไม่มี ติดตั้ง glibc-devel ผ่าน yum ซึ่งติดตั้ง i386 บิตและสิ่งนี้ช่วยแก้ปัญหาของฉันได้


0

แม้ว่าฉันจะได้รับข้อผิดพลาดในการคอมไพล์เดียวกันเมื่อฉันคอมไพล์ข้าม i686-cm-linux-gcc

ตัวเลือกการรวบรวมด้านล่างช่วยแก้ปัญหาของฉันได้

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

หมายเหตุ: sysrootควรชี้ไปที่ไดเร็กทอรีคอมไพเลอร์ที่มี usr / include

ในกรณีของฉัน toolchain ถูกติดตั้งที่ไดเร็กทอรี / opt / toolchain / i686-cm-linux-gcc และ usr / include อยู่ในไดเร็กทอรีเดียวกัน


0

ฉันแก้ไขได้ดังนี้:

1) พยายามค้นหาไฟล์ ctr1.o และ ctri.o โดยใช้ find -name ctr1.o

ฉันมีสิ่งต่อไปนี้ในคอมพิวเตอร์ของฉัน: $/usr/lib/i386-linux/gnu

2) เพิ่มพา ธ นั้นไปPATHยังLIBRARY_PATHตัวแปรสภาพแวดล้อม(ด้วย) (เพื่อดูว่าenvคำสั่งname: type ใดใน Terminal):

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

เพื่อหลีกเลี่ยงความสับสนบรรทัด $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ export PATH คือ:
pac88

0

วันนี้ฉันมีปัญหาเดียวกันฉันแก้ไขได้โดยติดตั้งแพ็คเกจที่แนะนำ: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

สิ่งนี้ได้ผล:

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

-1

ในกรณีของฉันข้อผิดพลาด crti.o ถูกป้อนโดยการกำหนดค่าพา ธ การดำเนินการจาก Matlab ตัวอย่างเช่นคุณไม่สามารถดำเนินการไฟล์ได้หากคุณไม่ได้กำหนดเส้นทางของไดเร็กทอรีการดำเนินการไว้ก่อนหน้านี้ ทำได้โดย: File> setPath เพิ่มไดเร็กทอรีของคุณและบันทึก



-2

ในกรณีของUbuntu 16.04ฉันฉันไม่มีcrti.oเลย:

$ find /usr/ -name crti*

ดังนั้นฉันจึงติดตั้งแพ็คเกจlibc 6 -dev ของนักพัฒนา:

sudo apt-get install libc6-dev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.