संकलन समस्याओं: crt1.o नहीं मिल सकता है


114

मेरे पास एक आभासी डेबियन प्रणाली है जिसे मैं विकसित करने के लिए उपयोग करता हूं।

आज मैं llvm / clang की कोशिश करना चाहता था।

क्लैंग स्थापित करने के बाद मैं अपने पुराने सी-प्रोजेक्ट्स को संकलित नहीं कर सकता (जीसीसी के साथ)। यह त्रुटि है:

...
/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
मिकहास

1
मैक के लिए, देखें: stackoverflow.com/questions/1365211/…
kenorb


यह लॉन्चपैड में एक BUG की सूचना है, बाइट एक वर्कअराउंड है: askubuntu.com/questions/251978/…
Roman

जवाबों:


91

डेबियन / उबंटू

समस्या यह है कि आप अपने वर्तमान वास्तुकला के लिए केवल gcc की संभावना रखते हैं और यह 64 बिट है। आपको 32 बिट समर्थन फ़ाइलों की आवश्यकता है। उसके लिए, आपको उन्हें स्थापित करने की आवश्यकता है

sudo apt install gcc-multilib

2
उबंटू पर यह काम किया sudo apt-get install gcc-multilibऔर इसने मेरी त्रुटि को तय कियाgfortran -m32 ...
randwa1k

1
अधिक विशिष्ट प्रश्न जिसमें 64 बनाम 32 कारण का उल्लेख किया गया है: stackoverflow.com/questions/21724540/…
Ciro Santilli Sant ions ions

62

प्रतीकात्मक लिंक बनाने में मुझे क्या मदद मिली:

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

5
यह काम करता है, हालांकि यह आपको प्रभावी ढंग से डेबियन मल्टीकार पर सिर्फ एक आर्क देता है।
13

2
मुझे वही समस्या थी जो एक क्रॉस-कंपाइलिंग टूलचैन को सेटअप करने की कोशिश कर रही थी जो किसी ने मुझे टार बंडल के रूप में दिया था। मुझे स्ट्रेस (यानी "स्ट्रेस gcc <मेरे सभी तर्क> 2> & 1; grep crt1.o") का उपयोग करना था, यह देखने के लिए कि gcc crt1.o की तलाश में था, इसलिए मैं यह पता लगा सकता हूं कि क्या प्रतीकात्मक लिंक बनाना है।
एंड्रयू बैनब्रिज

37

ऐसा लगता है कि जब आप llvm / clang के साथ खेल रहे थे (या पैकेज मैनेजर) ने पहले से मौजूद मानक C लाइब्रेरी डेवलपमेंट पैकेज ( Eglibc ) को हटा दिया था डेबियन पर या शायद आपने इसे पहले स्थान पर स्थापित नहीं किया था, इस प्रकार आपको पुनः स्थापित करने की आवश्यकता है यह, अब जब आप वापस gcc में वापस आ गए।

आप डेबियन पर ऐसा कर सकते हैं:

aptitude show libc-dev

उबंटू:

apt-get install libc-dev

उबंटू पर, अगर आपके पास libc-dev नहीं है, क्योंकि मैं इसे package.ubuntu.com पर नहीं पा रहा हूं, तो आप libc6-dev को सीधे इंस्टॉल करने का प्रयास कर सकते हैं।

या सिस्टम की तरह Redhat पर:

yum glibc-devel स्थापित करें

एनबी: यद्यपि आपको टिप्पणियों में संक्षेप में उत्तर दिया गया था, यहां एक जवाब है, इसलिए रिकॉर्ड में कोई एक है अगर कोई इस का सामना करता है और एक उत्तर की तलाश में हो सकता है, लेकिन टिप्पणियों या टिप्पणी में उनके लिए पर्याप्त स्पष्ट नहीं है ।


1
ऐसा नहीं है कि डेबियन का मल्टीचर्ड सामान बहुत सारे निर्माण को तोड़ता है, अक्सर इस त्रुटि के साथ। निर्यात LD_LIBRARY_PATH चाल कर सकता है।
deadalnix

3
यह अल्पाइन लाइनक्स के लिए मदद करता हैapk add libc-dev=0.7.1-r0
यू जियाओ सेप

27

यह लॉन्चपैड में रिपोर्ट की गई BUG है , लेकिन एक वर्कअराउंड है:

यह देखने के लिए इसे चलाएँ कि ये फ़ाइलें कहाँ स्थित हैं

$ 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 को काम करता है। यह पसंदीदा मार्ग है यदि आप अपने सिस्टम के पुस्तकालयों को बनाना नहीं चाहते हैं
BobTuckerman

17

यदि आप डेबियन के परीक्षण संस्करण का उपयोग कर रहे हैं, जिसे 'मट्ज़ी' कहा जाता है, तो आपको मल्टीकार करने के लिए कदम से काट लिया गया होगा। यहाँ डेबियन की बहु के बारे में अधिक जानकारी: http://wiki.debian.org/Multiarch

असल में, जो कुछ हो रहा है वह है विभिन्न आर्किटेक्चर विशिष्ट लाइब्रेरीज़ को फ़ाइल सिस्टम में पारंपरिक स्थानों से नए आर्किटेक्चर विशिष्ट स्थानों पर ले जाया जा रहा है। इसलिए/usr/bin/ld भ्रमित है।

आप दोनों में crt1.o मिलेगा /usr/lib64/और /usr/lib/i386-linux-gnu/अब और आप उस के बारे में अपने toolchain बताने के लिए की आवश्यकता होगी। यहाँ कुछ प्रलेखन है कि कैसे करना है; http://wiki.debian.org/Multiarch/LibraryPathOverview

ध्यान दें कि केवल एक सिमलिंक बनाने से आपको केवल एक वास्तुकला मिलेगी और आप अनिवार्य रूप से मल्टीकार को अक्षम कर देंगे। हालांकि यह वही हो सकता है जो आप चाहते हैं कि यह इष्टतम समाधान नहीं हो सकता है।


3
"कैसे अपने टूलकिन को उस बारे में बताएं" पर थोड़ा और शानदार होगा, क्योंकि यह ठीक ऐसी स्थिति है जिसमें मैं अंदर हूं। धन्यवाद।
सुल्क्स

सबसे पहले, आपको यह जानना होगा कि आप किस वास्तुकला के लिए निर्माण कर रहे हैं। क्या आप एक AMD64 आधारित एप्लिकेशन का निर्माण कर रहे हैं? यदि हां, तो आपको 'ld' बताने की आवश्यकता होगी जहाँ AMD64 आधारित साझा ऑब्जेक्ट फ़ाइलें हैं, यानी .o फ़ाइलें जिनकी आपको आवश्यकता है। यदि आप एक AMD64 पर काम कर रहे हैं, तो उन्हें / usr / lib64 में होना चाहिए
jeremiah

16

Http://wiki.debian.org/Multiarch/LibraryPathOverview में यह पढ़ने के बाद कि jeremiah ने पोस्ट किया है, मुझे gcc झंडा मिला है जो सिमलिंक के बिना काम करता है:

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

तो, आप बस -B/usr/lib/x86_64-linux-gnuअपने मेकफाइल में CFLAGS चर में जोड़ सकते हैं ।


@DDDac आपको Ubuntu 16.04, AFAICT में किसी भी ध्वज की आवश्यकता नहीं है।
एलेक्सम

9

आरसीईएल 7 64-बिट को जीसीसी 4.8 32-बिट कार्यक्रमों को संकलित करने के लिए, आपको दो चीजें करने की आवश्यकता होगी।

  1. सुनिश्चित करें कि सभी 32-बिट gcc 4.8 विकास उपकरण पूरी तरह से स्थापित हैं:

    sudo yum install glibc-devel.i686 libgcc.i686 libstdc++-devel.i686 ncurses-devel.i686
  2. -M32 ध्वज का उपयोग कर संकलन कार्यक्रम

    gcc pgm.c -m32 -o pgm

यहाँ से चोरी: 64-बिट आरएचईएल पर 32-बिट ऐप्स को कैसे संकलित करें? - मुझे केवल चरण 1 करना था।


6

जैसा कि crti.o फ़ाइल गुम में बताया गया है , सभी खोज पथ का पता लगाने के लिए "gcc -print-search-dirs" का उपयोग करना बेहतर है। फिर crt1.o के स्थान को इंगित करने के लिए "sudo ln -s" के ऊपर एक लिंक बनाएं




1

सेंटो 5.4 पर इस में भाग गया। ध्यान दें कि lib64 में crt * .o फाइलें समाहित थीं, लेकिन lib नहीं थी। Yum के माध्यम से स्थापित glibc-devel जिसने i386 बिट्स को स्थापित किया और इसने मेरे मुद्दे को हल किया।


0

यहां तक ​​कि मुझे एक ही संकलन त्रुटि मिली जब मैं i686-cm-linux-gcc का संकलन कर रहा था।

नीचे संकलन विकल्प ने मेरी समस्या हल कर दी

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

नोट: sysroot को कंपाइलर डायरेक्टरी की ओर इंगित करना चाहिए जहाँ usr / उपलब्ध है

मेरे मामले में Toolchain / opt / toolchain / i686-cm-linux-gcc निर्देशिका में स्थापित है और usr / शामिल भी उसी निर्देशिका में उपलब्ध है


0

मैंने इसे इस प्रकार हल किया:

1) ctr1.o और ctri.o फ़ाइलों का उपयोग करके खोजने की कोशिश करें find -name ctr1.o

मुझे अपने कंप्यूटर में निम्नलिखित मिला: $/usr/lib/i386-linux/gnu

2) पर्यावरण चर (उस नाम को देखने के लिए (जो नाम है: टर्मिनल में टाइप करें) के लिए उस पथ को PATHभी जोड़ेंLIBRARY_PATHenv

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

भ्रम से बचने के लिए, लाइन $ PATH = / usr / lib / i386-linux / gnu: $ PATH $ निर्यात PATH वास्तव में है:
pac88

0

मुझे आज भी यही समस्या थी, मैंने इसे अनुशंसित पैकेजों को स्थापित करके हल किया: libc6-dev-mipsel-cross libc6-dev-mipsel-cross, libc-dev-mipsel-cross

यह काम किया:

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

-1

मेरे मामले में, Matlab से निष्पादन पथ कॉन्फ़िगरेशन द्वारा crti.o त्रुटि दर्ज की गई थी। उदाहरण के लिए, यदि आपने पहले अपनी निष्पादन निर्देशिका का पथ निर्धारित नहीं किया है, तो आप कोई फ़ाइल नहीं कर सकते। ऐसा करने के लिए: फ़ाइल> सेट करें, अपनी निर्देशिका जोड़ें और सहेजें।



-2

मेरे मामले में Ubuntu 16.04मेरे पास crti.oबिल्कुल नहीं है:

$ find /usr/ -name crti*

इसलिए मैं डेवलपर lib 6 -dev पैकेज स्थापित करता हूं :

sudo apt-get install libc6-dev
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.