जब उबंटू में 32 बिट पर 64 बिट प्रोग्राम को पार करते समय मिसिंग में "बिट्स / सी ++ config.h" शामिल होता है


181

मैं Ubuntu 10.10 के 32 बिट संस्करण को चला रहा हूं और 64 बिट लक्ष्य के संकलन को पार करने की कोशिश कर रहा हूं। मेरे शोध के आधार पर, मैंने जी ++ - मल्टीबिल पैकेज स्थापित किया है।

कार्यक्रम एक बहुत ही सरल हैलो दुनिया है:

#include <iostream>

int main( int argc, char** argv )
{
  std::cout << "hello world" << std::endl;
  return 0;
}

संकलित करें:

g++ -m64 main.cpp

त्रुटि:

In file included from main.cpp:1:
/usr/include/c++/4.4/iostream:39: fatal error: bits/c++config.h: No such file or directory
compilation terminated.

मुझे एक c++config.hफ़ाइल मिली है, लेकिन वे इन i486-linux-gnuएंड i686-linux-gnuडाइरेक्टरीज़ के अंतर्गत रहते हैं और /usr/include/c++/4.4/वहाँ नहीं c++config.hहै /usr/include/c++/bits

मैं क्या याद कर रहा हूँ पर कोई विचार? -m64ध्वज के बिना संकलन ठीक काम करता है (a.out बनाया गया है और सही तरीके से चलता है)।

संपादित करें धन्यवाद @nightcracker से संकेत करने के लिए, मैं एक छोटे से अधिक जांच में 32 और 64 बिट सिस्टम पर संरचना शामिल किया था। मैंने नीचे एक उत्तर जोड़ा है कि समस्या को अस्थायी रूप से "ठीक करता है" लेकिन मुझे लगता है कि यह अगले अद्यतन पर टूट जाएगा। असल में, मुझे एक निर्देशिका याद आ रही है /usr/include/c++/4.4/i686-linux-gnu/64जिसमें एक उपनिर्देशिका होनी चाहिए जिसे कहा जाता bitsहै जिसमें लापता फ़ाइल शामिल है। किसी भी विचार क्या पैकेज का ख्याल रखना चाहिए?


1
वाह ... मुझे भी यह समस्या थी। एक ARMv7 पर GCC 4.8- एक उबंटू चलाने वाला एक क्यूब्रीक (कोर्टेक्स-ए 7)। विचित्र बात (मेरे लिए) है, एंथनी के जवाब ने इसे ठीक कर दिया। जो भी ...
jww

जवाबों:


308

इस उत्तर को आंशिक रूप से जोड़ना क्योंकि इसने मेरी समस्या उसी समस्या को ठीक कर दिया है और इसलिए मैं स्वयं इस प्रश्न को बुकमार्क कर सकता हूं।

मैं निम्नलिखित करके इसे ठीक करने में सक्षम था:

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

यदि आपने gcc/ का एक संस्करण स्थापित किया है, जो g++डिफ़ॉल्ट रूप से जहाज नहीं करता है (जैसे कि g++-4.8ल्यूसिड पर) तो आप संस्करण से भी मिलान करना चाहेंगे:

sudo apt-get install gcc-4.8-multilib g++-4.8-multilib

30
gcc and g++अपने सिस्टम पर इंस्टॉल किए गए संस्करणों से मिलान करना सुनिश्चित करें । Ubuntu 14.04 पर मैंने स्थापित किया था gcc-4.8और g++-4.8इसलिए मैंने इसे स्थापित किया gcc-4.8-multilib और g++-4.8-multilibइसके बजाय।
ज़ोल्टन

3
64-बिट मशीन पर -32 से संकलन करते समय इसने मेरी समस्या हल कर दी। धन्यवाद
nic

41
सूचक के लिए धन्यवाद, लेकिन sudo apt-get install gcc-multilib g++-multilibबेहतर लगता है (यह स्वचालित रूप से आपके जीसीसी संस्करण का समाधान करता है)।
लीसी

^ शायद नहीं! @ ज़ोल्टन के सुझाव ने मेरे लिए काम किया। एंथोनी सॉटाइल, शायद आपको अपने उत्तर में ज़ोल्टन की टिप्पणी को शामिल करना चाहिए?
मैन

@ मैन एक संपादन का सुझाव देने के लिए स्वतंत्र महसूस करता हूं, जब मैंने शुरू में इसे पोस्ट किया था तो मैंने सवाल में पूछे गए संस्करण से मिलान किया था, यह तब से दूसरे के संपादन से बदल गया है
एंथनी सॉटाइल

11

आपने जोड़ने की कोशिश की -I/usr/include/c++/4.4/i486-linux-gnuया -I/usr/include/c++/4.4/i686-linux-gnu?


वह वास्तव में काम करता है। किसी भी विचार पर मुझे केवल 64 बिट के लिए ऐसा करने की आवश्यकता क्यों होगी? मैं 64 बिट बिल्ड वितरित और बहुत अधिक अनुकूलन से बचने के लिए मदद करने के लिए इस मशीन को स्थापित करने की कोशिश कर रहा हूं।
जेसी वोग्ट

2
मुझे खेद है, मुझे कुछ पता नहीं है, मैंने बस एक त्वरित
हैकिंग

5

आरएचईएल 6.2 (x86_64) में संकलित करते हुए, मैंने 32 बिट और 64 बिट के लिबस्टीडीसी ++ - देव संकुल दोनों को स्थापित किया, लेकिन मेरे पास "c ++ config.h ऐसी कोई फ़ाइल या निर्देशिका " समस्या नहीं थी।

संकल्प:

निर्देशिका /usr/include/c++/4.4.6/x86_64-redhat-linuxगायब थी।

मैंने निम्नलिखित कार्य किया:

cd /usr/include/c++/4.4.6/
mkdir x86_64-redhat-linux
cd x86_64-redhat-linux
ln -s ../i686-redhat-linux 32

अब मैं 64 बिट ओएस पर 32 बिट बायनेरिज़ को संकलित करने में सक्षम हूं।


1
OpenSUSE पर मैंनेcd /usr/include/c++/4.6;ln -s x86_64-suse-linux i586-suse-linux
जूलियन

3

लगता है कि जीसीसी के उस पैकेज में एक टाइपो त्रुटि है। समाधान:

mv /usr/include/c++/4.x/i486-linux-gnu /usr/include/c++/4.x/i686-linux-gnu/64

2

मेरे 64 बिट सिस्टम पर मैंने देखा कि निम्नलिखित निर्देशिका मौजूद थी:

/usr/include/c++/4.4/x86_64-linux-gnu/32/bits

तब यह समझ में आता है कि मेरे 32 बिट सिस्टम पर जो 64bit क्रॉस कंपाइलिंग के लिए सेटअप किया गया था, उसी तरह की डायरेक्टरी होनी चाहिए:

/usr/include/c++/4.4/i686-linux-gnu/64/bits

मैंने दोबारा जाँच की और यह निर्देशिका मौजूद नहीं थी। g++वर्बोज़ पैरामीटर के साथ चलने से पता चला कि संकलक वास्तव में इस स्थान में कुछ ढूंढ रहा था:

jesse@shalored:~/projects/test$ g++ -v -m64 main.cpp 
Using built-in specs.
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 
COLLECT_GCC_OPTIONS='-v' '-m64' '-shared-libgcc' '-mtune=generic'
 /usr/lib/gcc/i686-linux-gnu/4.4.5/cc1plus -quiet -v -imultilib 64 -D_GNU_SOURCE main.cpp -D_FORTIFY_SOURCE=2 -quiet -dumpbase main.cpp -m64 -mtune=generic -auxbase main -version -fstack-protector -o /tmp/ccMvIfFH.s
ignoring nonexistent directory "/usr/include/c++/4.4/i686-linux-gnu/64"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../i686-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/4.4
 /usr/include/c++/4.4/backward
 /usr/local/include
 /usr/lib/gcc/i686-linux-gnu/4.4.5/include
 /usr/lib/gcc/i686-linux-gnu/4.4.5/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
GNU C++ (Ubuntu/Linaro 4.4.4-14ubuntu5) version 4.4.5 (i686-linux-gnu)
    compiled by GNU C version 4.4.5, GMP version 4.3.2, MPFR version 3.0.0-p3.
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128197
Compiler executable checksum: 1fe36891f4a5f71e4a498e712867261c
In file included from main.cpp:1:
/usr/include/c++/4.4/iostream:39: fatal error: bits/c++config.h: No such file or directory
compilation terminated.

ignoring nonexistent directoryसुराग के संबंध में त्रुटि थी। दुर्भाग्य से, मुझे अभी भी पता नहीं है कि इस निर्देशिका को दिखाने के लिए मुझे किस पैकेज को स्थापित करने की आवश्यकता है इसलिए मैंने /usr/include/c++/4.4/x86_64-linux-gnu/bitsअपनी 32 बिट मशीन /usr/include/c++/4.4/i686-linux-gnu/64/bitsपर 64 बिट मशीन से निर्देशिका को कॉपी किया ।

अब सिर्फ -m64सही ढंग से काम करता है। मुख्य दोष यह है कि यह अभी भी चीजों को करने का सही तरीका नहीं है और मैं अनुमान लगा रहा हूं कि अगली बार जब अपडेट प्रबंधक स्थापित हो और जी ++ चीजों को अपडेट टूट जाए।



1

मूल रूप से इसका उपयोग HeapOverflows या अन्य उलटा प्रकार की समस्याओं में किया जाता है अर्थात यदि आप 64 बिट ELF को 32 बिट ELF में बदलना चाहते हैं और इसे कनवर्ट करते समय त्रुटि दिखाई दे रही है।

आप बस कमांड चला सकते हैं

apt-get install gcc-multilib g++-multilib

जो आपके पुस्तकालयों को अद्यतन करेगा संकुल उन्नत:

निम्नलिखित अतिरिक्त पैकेज स्थापित किए जाएंगे: g ++ - 8-multilib gcc-8-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpxx lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 lib-dev-dev-dev-dev -i386 libc6-dev-x32 libc6-i386 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gcc1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev-lib -6-dev-lib -6-32 8-dbg glibc-doc निम्नलिखित नए पैकेज स्थापित किए जाएंगे:g ++ - 8-multilib g ++ - multilib gcc-8-multilib gcc-multilib lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm13232mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32stdan6/1f6v6=1326b6/6 8-देव libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-देव libx32stdc ++ 6 libx32ubsd1

इसके समान आपके टर्मिनल पर दिखाया जाएगा


0

मेरे अनुभव से, sudo apt-get install gcc-multilib g++-multilibमदद करता है। लेकिन मेरा एक और मुद्दा यह है कि मैं निर्देशिका को साफ करने के लिए भूल जाता हूं इसलिए मुझे अभी भी वही त्रुटि मिलती है। यह पहली बार क्लैंग या सेमीके का उपयोग करने के लिए है। इसलिए मैं अपनी मूल निर्देशिका और फिर से संकलित करता हूं और यह काम करता है। आशा है कि यह मेरे जैसे किसी की मदद करेगा।

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