कैसे gcc / cmake के साथ 64-बिट लिनक्स मशीन पर 32-बिट बाइनरी संकलित करें


129

क्या 32-बिट में cmakeऔर 64-बिट सिस्टम gccपर किसी प्रोजेक्ट को संकलित करना संभव है? यह शायद है, लेकिन मैं इसे कैसे करूं?

जब मैंने इसे "अनभिज्ञ" तरीके से आज़माया, बिना किसी पैरामीटर / झंडे / आदि LD_LIBRARY_PATHको स्थापित किए , बस इसमें लिंक किए गए पुस्तकालयों को खोजने के लिए सेट ~/tools/libकरना इसे अनदेखा करना प्रतीत होता है और केवल lib64 नाम की उपनिर्देशिकाओं में देखें


1
क्या यह झंडा -32 को पास करने के लिए पर्याप्त होगा Gcc? फिर मैं इसे सीमैके में कैसे करूंगा?
डेला

जवाबों:


124
export CFLAGS=-m32

2
यह करना चाहिए। तुम भी एक 32 बिट लक्ष्य बनाने के लिए cmake स्क्रिप्ट को संशोधित कर सकता है - यह सिर्फ जोड़ना होगा -m32करने के लिए CFLAGS, शायद सेटिंग से CMAKE_REQUIRED_FLAGS
कैफे

5
खैर, समस्या यह है कि यह निश्चित रूप से पर्याप्त नहीं है। आपको लिंकर को भी ट्विक करने की आवश्यकता हो सकती है!
lpapp

6
क्या exportमतलब है? यह कहाँ का है? ते हेडर फाइलें? makefile? नहीं, एक शुरुआत के रूप में मेरे लिए पूरी तरह से एक जवाब नहीं है।
टॉम ज़ातो -

1
@ TomášZato: शेल प्रॉम्प्ट में, आह्वान करने से पहले cmake(हालांकि आपके मामले में, अगर आपके पास मेकफाइल है, तो आप makeइसके बजाय उपयोग करेंगे )।
कैफे

4
@ कैफ, क्या आप कृपया अपने उत्तर के बारे में विस्तार से बता सकते हैं? आपका जवाब बहुत ही कठिन है और कुछ भी नहीं समझाता है।
एम।

76
$ gcc test.c -o testc
$ फ़ाइल testc
टेस्टक: ईएलएफ 64-बिट एलएसबी निष्पादन योग्य, x86-64, संस्करण 1 (SYSV), गतिशील रूप से जुड़ा हुआ है (जीएनयू / लिनक्स 2.6.9 का साझा उपयोग करता है), छीन नहीं
$ ldd testc 
    linux-vdso.so.1 => (0x00007fff227ff000)
    libc.so.6 => / lib64/libc.so.6 (0x000000391f000000)
    /l6464/ld-linux-x86-64.so.2 (0x000000391ec00000)
$ gcc -m32 test.c -o testc
$ फ़ाइल testc
टेस्टक: ईएलएफ 32-बिट एलएसबी निष्पादन योग्य, इंटेल 80386, संस्करण 1 (एसवाईएसवी), गतिशील रूप से जुड़ा हुआ है (जीएनयू / लिनक्स 2.6.9 के लिए साझा उपयोग का उपयोग करता है), छीन नहीं
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2 (0x0075b000)

संक्षेप में: -m3232-बिट बाइनरी संकलित करने के लिए ध्वज का उपयोग करें ।

यह भी सुनिश्चित करें कि आपके पास सभी आवश्यक पुस्तकालयों के 32-बिट संस्करण स्थापित हैं (मेरे मामले में फेडोरा पर मेरी आवश्यकता के सभी glibc-devel.i386 थे)


1
बहुत धन्यवाद! हां, मेरे पास निर्भरता के 32-बिट संस्करण हैं।
डेला

6
मैं पुस्तकालयों के 32 बिट संस्करण कैसे स्थापित कर सकता हूं?
टॉम ज़ातो -

2
@ टॉमेज़ोटोsudo apt-get install gcc-multilib
मैथ्यू मर्डोक

16

CMake के बाद के संस्करणों में, प्रत्येक लक्ष्य पर इसे करने का एक तरीका है:

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

मैं इसे विश्व स्तर पर करने का एक तरीका नहीं जानता।


+1। मैं 64-बिट हिम तेंदुए पर 32-बिट टैगलिब ( developer.kde.org/~wheeler/taglib.html ) बनाने की कोशिश कर रहा हूं । यह मेरे लिए काम करता है।
एडवर्डव जूल

3
… विश्व स्तर पर करने के लिए:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
डायोमास

7

C ++ के लिए, आप कर सकते हैं:

export CXXFLAGS=-m32

यह cmake के साथ काम करता है।


6

एक तरीका यह है कि चेरोट वातावरण तैयार किया जाए। डेबियन के पास इसके लिए कई उपकरण हैं, उदाहरण के लिए डेबूटस्ट्रैप


2
सिर्फ 32-बिट ऐप्स बनाने के लिए चेरोट वातावरण सेट करने के लिए थोड़ा चरम लगता है, है ना? कोई विशेष कारण जो आप सुझाते हैं?
फ्रेड्रिक

3
यह आपको एक पूरा वातावरण देता है जिसमें कोड भी चलाना होता है। हम 64 बिट होस्ट पर पूर्ण 32 बिट बायनेरिज़ बनाने (और चलाने) का उपयोग करते हैं - कभी-कभी आपको केवल थर्ड पार्टी लाइब्रेरीज़ के 32 बिट बिल्ड मिलते हैं। डेबियन काम के लिए, हम इसका उपयोग 64 बिट मेजबानों पर 32 बिट पैकेज बनाने के लिए करते हैं।
डिर्क एडडेलबेटेल

मैंने कभी भी ऐसी किसी भी समस्या का अनुभव नहीं किया है कि लिनेक्स, सोलारिस और न ही 64-बिट प्लेटफ़ॉर्म पर पूर्ण 32-बिट बायनेरिज़ के निर्माण और चलाने में क्या हुआ। लेकिन मैं डेबियन का ज्यादा इस्तेमाल नहीं कर रहा हूं।
फ्रेड्रिक

फ्रेडरिक, क्या आप 64 बिट बिल्ड होस्ट पर 32 बिट में भी उन्हें तैनात करते हैं?
डिर्क एडल्डबुलेटेल

@ डर्क: 32 बिट बायनेरी 32 और 64 बिट मशीनों दोनों पर काम करते हैं (बेशक), 64 बिट बायनेरिज़ केवल 64 बिट मशीनों पर काम करते हैं। इससे कोई फर्क नहीं पड़ता कि यह ग्राहक मशीन है या बिल्ड होस्ट। मैं ईमानदारी से यह नहीं देखता कि समस्या तब तक होगी जब तक कि यह कर्नेल मॉड्यूल नहीं है जो आप बना रहे हैं।
फ्रेड्रिक

6

किसी भी जटिल अनुप्रयोग के लिए, मैं एक lxc कंटेनर का उपयोग करने का सुझाव देता हूं । lxc कंटेनरों 'स्टेरॉयड पर एक चुरोट के बीच बीच में कुछ और एक पूर्ण आभासी मशीन' हैं।

उदाहरण के लिए, यहाँ Ubuntu ट्रस्टी सिस्टम पर lxc का उपयोग करके 32-बिट वाइन बनाने का एक तरीका है:

sudo apt-get install lxc lxc-templates
sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386 --release trusty
sudo lxc-start -n my32bitbox
# login as yourself
sudo sh -c "sed s/deb/deb-src/ /etc/apt/sources.list >> /etc/apt/sources.list"
sudo apt-get install devscripts
sudo apt-get build-dep wine1.7
apt-get source wine1.7
cd wine1.7-*
debuild -eDEB_BUILD_OPTIONS="parallel=8" -i -us -uc -b
shutdown -h now   # to exit the container

यहाँ liki का उपयोग करके 64-बिट होस्ट पर 32-बिट वाइन बनाने के बारे में विकी पेज है ।


दिलचस्प। क्या मैं atom64 बिट मशीन में 32 बिट के लिए टेक्स्ट एडिटर संकलित करने के लिए इसका उपयोग कर सकता हूं ?
अनवर

1
@ अनवर, मुझे ऐसा लगता है। यह कुछ भी बनाने के लिए काम करना चाहिए।
सैम वाटकिंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.