64-बिट उबंटू में 32-बिट ऐप का निर्माण


23

गुग्लिंग के घंटों के बाद, मैं आपको विशेषज्ञों से हार मानने का फैसला करता हूं। मैं अपने 64 Ubuntu 11.10 में 32-बिट एप्लिकेशन (अगर किसी को दिलचस्पी है तो xgap) बनाने की कोशिश कर रहा हूं। मैंने CFLAGS = -m32 और LDFLAGS = -L / usr / lib32 को मेकफाइल में जोड़ा । ऑब्जेक्ट्स को 32 बिट फाइन में बनाया गया है। अंतिम चरण एक्स निष्पादन के लिए सभी वस्तुओं और पुस्तकालयों को इस निष्पादन योग्य --- xgap से जोड़ना है। किसी तरह यह मुझे यह त्रुटि देता रहता है:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...

मैंने ia32- lib और mutilib समर्थन स्थापित किया है । मुझे लगता है कि मुझे सिर्फ एक i386 आउटपुट उत्पन्न करने के लिए लिंकर को मजबूर करने की आवश्यकता है। मैंने अपने gcc कमांड में दो ld झंडे लगाने की कोशिश की जैसा कि ऊपर दिखाया गया है: -melf_i386 और -oformat elf32-i386 । लेकिन क्या होता है कि gcc / usr / lib32 में अब 32 बिट लाइब्रेरी की खोज नहीं करता है । मुझे आश्चर्य है कि क्या मुझे उन झंडों को किसी निश्चित क्रम में लगाने की आवश्यकता है?

किसी भी विचार और मदद के लिए धन्यवाद!

संपादित करें: जब मैं अपने अंतिम gcc कमांड में -m32 ध्वज जोड़ता हूं (लिंकिंग चरण जिसे मैं मानता हूं), भले ही मेरे पास -L / usr / lib32 झंडा हो, gcc अब / usr / lib32 में खोज नहीं करता है (वास्तव में अजीब ...) और निम्न त्रुटि उत्पन्न करता है:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

किसी को भी किसी भी विचार क्यों ऐसा होता है? मैं कॉन्फ़िगर करने और बनाने के लिए ऑटो टूल का उपयोग कर रहा हूं। मैं वास्तव में उन स्क्रिप्ट फ़ाइलों को संशोधित करने में अच्छा हूं।

EIDT : मैंने समस्या हल कर दी। मुझे लगता है कि जीसीसी एक स्थिर पुस्तकालय संग्रह की उम्मीद कर रहा था। लिंकिंग के लिए आवश्यक सभी .a अभिलेखागार को डाउनलोड करने के लिए मैंने http://ubuntuforums.org/showthread.php?t=474790 से getlibs स्क्रिप्ट का उपयोग किया । फिर जीसीसी ने काम किया। मुझे लगता है कि जीसीसी में खोज किया था / usr / lib32 निर्देशिका लेकिन नहीं मिला अभिलेखागार तो मानक निर्देशिका जो है में खोज करने के लिए पर चला गया / usr / lib जहां यह पाता है असंगत, .so * फ़ाइलें।

लेकिन फिर सवाल यह है: * .so फ़ाइलों में / usr / lib32 / पैकेज से ia32-libs वास्तव में लिंक करने के लिए आवश्यक पुस्तकालयों नहीं है? उन फ़ाइलों / usr / lib32 / के लिए क्या उपयोग किया जाता है?



जवाबों:


15

LDFLAGSके -m32रूप में अच्छी तरह से शामिल करना चाहिए । निम्नलिखित काम करना चाहिए:

export LDFLAGS='-m32 -L/usr/lib32'

वास्तव में, आप -L/usr/lib32हिस्सा छोड़ सकते हैं , क्योंकि यह 32 बिट के लिए एक डिफ़ॉल्ट निर्देशिका है, और आपका सिस्टम इसके बारे में जागरूक है।

मूल रूप से, 64 बिट मशीन पर 32 बिट अनुप्रयोग बनाने का सबसे सरल तरीका है:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

.. यदि आप ऑटोटूल का उपयोग कर रहे हैं तो स्क्रिप्ट को कॉन्फ़िगर करने के लिए उन चर को फ़ीड करें

अद्यतन करें:

ऐसा लगता है कि आप वास्तव में स्थिर और गतिशील पुस्तकालयों से जुड़ने के अंतर के बारे में परिचित नहीं हैं। मैं यथासंभव न्यूनतम होने की कोशिश करूँगा:

  • स्थैतिक और गतिशील दोनों विकास पुस्तकालयों में एक ही फाइल एक्सटेंशन है .a
  • यदि आपने एक ही लाइब्रेरी के स्थिर और गतिशील दोनों संस्करण स्थापित किए हैं, तो उनमें से एक में अतिरिक्त पोस्टफ़िक्स हो सकते हैं, जैसे libname.aडायनेमिक और libname_s.aस्थिर संस्करण के लिए।
  • निश्चित, स्थिर और गतिशील लाइब्रेरी संस्करण आकार में भिन्न होते हैं। स्थैतिक संस्करण भारी है।
  • यदि आप स्थैतिक पुस्तकालय के साथ लिंक करते हैं - आपके आवेदन में कोई निर्भरता नहीं है। यदि आप डायनेमिक लाइब्रेरी से लिंक करते हैं, तो यह .soरनटाइम लाइब्रेरी पर निर्भर करेगा जो आपके सिस्टम में मौजूद होनी चाहिए।

कृपया ध्यान दें, हम यहां उन्नत चाल के बारे में बात नहीं कर रहे हैं, जैसे कि डीएसओ की स्पष्ट लोडिंग का उपयोग करते हुए dlopen () / dlsym () API।


अब मुझे लगता है कि मेरे सेटअप में कुछ गड़बड़ है। जब भी मैं अपने अंतिम gcc कमांड में -m32 जोड़ता हूं, यह इसके बजाय / usr / lib फ़ोल्डर को खोजता है। यदि मैं -m32 नहीं जोड़ता हूं, और -L / usr / lib32 ध्वज का उपयोग करता हूं, तो यह सही निर्देशिका की खोज करता है लेकिन उपरोक्त त्रुटियों को उत्पन्न करता है। क्या आप जानते हैं कि इसका क्या कारण हो सकता है?
रिच

और क्या होगा यदि आप दोनों को जोड़ते हैं (जैसा कि ऊपर मेरे उदाहरण में है)?
बेफिक्रे कैनिकोव्स

अगर मैं दोनों को जोड़ती हूं, तो यह अभी भी / usr / lib32 में खोज नहीं करता है। यह सिर्फ / usr / lib में खोज करता है। और btw, मैं ऑटो उपकरण का उपयोग कर रहा हूँ।
रिच

अजीब .. क्या तुमने -l/usr/lib32/libXaw.soइसके बजाय खिलाने की कोशिश की ?
बेफिक्रे कैनिकोव्स

यह उन्हें नहीं मिल सकता है ....: gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so / usr / lib32 / libXt.so-us / lib32 / libXext.so-us / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld: -l / usr / lib32 / libXaw.so
रिच

9

मुझे त्रुटियाँ मिल रही थीं जैसे:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

यह मेरे लिए यह तय:

sudo apt-get install g++-multilib

यदि आप डिफ़ॉल्ट के अलावा एक gcc पैकेज का उपयोग कर रहे हैं (जैसे gcc-7), तो आपको उस विशिष्ट संस्करण के लिए पैकेज को स्थापित करना होगा:

sudo apt-get install g++-7-multilib

1
g++-multilibg ++ (C ++) के लिए है, gcc (C) के लिए भी आपकी आवश्यकता है gcc-multilib
pevik
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.