উবুন্টুতে 32 বিটে যখন 64 বিট প্রোগ্রামটি ক্রস করে তখন "বিট / সি ++ কনফিগারেশন" অন্তর্ভুক্ত রয়েছে


181

আমি উবুন্টু 10.10 এর 32 বিট সংস্করণটি চালাচ্ছি এবং একটি 64 বিটের লক্ষ্য সংকলনটি অতিক্রম করার চেষ্টা করছি। আমার গবেষণার উপর ভিত্তি করে, আমি g ++ - বহুটিব প্যাকেজ ইনস্টল করেছি।

প্রোগ্রামটি একটি খুব সাধারণ হ্যালো ওয়ার্ল্ড:

#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
বাহ ... আমারও এই সমস্যা ছিল উবুন্টু চলমান একটি এআরএমভি 7-এ কিউবিট্রাক (কর্টেক্স-এ 7) এ জিসিসি 4.8। উদ্ভট জিনিসটি (আমার কাছে), অ্যান্টনির উত্তর এটি স্থির করেছিল। যাই হোক না কেন ...
jw

উত্তর:


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++আপনার সিস্টেমে ইনস্টল হওয়া সংস্করণগুলির সাথে মেলে তা নিশ্চিত করুন । উবুন্টুতে 14.04 এ আমি ইনস্টল করেছি gcc-4.8এবং g++-4.8ইনস্টল করেছি, তাই আমি ইনস্টল করেছিলাম gcc-4.8-multilib এবং g++-4.8-multilibপরিবর্তে।
জোল্টন

3
64-বিট মেশিনে -m32 দিয়ে সংকলন করার সময় এটি আমার সমস্যার সমাধান করেছে। ধন্যবাদ
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
আমি দুঃখিত, আমার কোনও ধারণা নেই, আমি কেবল একটি দ্রুত হকি ওয়ার্কিং সলিউশন প্রকাশ করেছি :)
orlp

5

আরএইচইএল 6.2 (x86_64) -তে সংকলন করার সময়, আমি 32 বিবিট এবং 64 বিট উভয়ই লিবস্টেডিসি ++ - ডেভ প্যাকেজ ইনস্টল করেছি, তবে আমার কাছে "সি ++ কনফিগারেশন। এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই " সমস্যা ছিল।

রেজোলিউশন:

ডিরেক্টরিটি /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 বিবিটি OS এ 32 বিবিট বাইনারি সংকলন করতে সক্ষম।


1
ওপেনসুসে আমি করেছি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

আমার bit৪ বিট সিস্টেমে আমি লক্ষ্য করেছি যে নিম্নলিখিত ডিরেক্টরিটি বিদ্যমান:

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

এটি তখন বুঝতে হবে যে আমার 32 বিট সিস্টেমে যে 64 বিট ক্রস সংকলনের জন্য সেটআপ করা হয়েছিল সেখানে একটি সম্পর্কিত ডিরেক্টরি থাকতে হবে:

/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আমার 64 বিট মেশিন থেকে ডিরেক্টরিটি /usr/include/c++/4.4/i686-linux-gnu/64/bits32 টি মেশিনে অনুলিপি করেছি।

এখন -m64সঠিকভাবে সঠিকভাবে কাজগুলি সংকলন করুন । প্রধান অসুবিধাটি হ'ল এটি এখনও জিনিসগুলি করার সঠিক উপায় নয় এবং আমি পরবর্তী সময় আপডেট ম্যানেজার ইনস্টল করে এবং জি ++ বিষয়গুলিতে আপডেটটি ভাঙ্গতে পারি বলে অনুমান করছি।



1

মূলত এটি হিপওভারফ্লোস বা অন্যান্য বিপরীত প্রবণতা সমস্যার ক্ষেত্রে ব্যবহৃত হয় অর্থাৎ আপনি যদি 64৪ বিট ইএলএফকে 32 বিট ইএলএফ পরিবর্তন করতে চান এবং রূপান্তর করার সময় এটি ত্রুটি দেখায়।

আপনি কেবল কমান্ডগুলি চালাতে পারেন

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

যা আপনার লাইব্রেরিগুলিকে আপগ্রেড করা প্যাকেজগুলি আপডেট করবে:

নিম্নলিখিত অতিরিক্ত প্যাকেজগুলি ইনস্টল করা হবে: g ++ - 8-মাল্টিলেব জিসিসি-8-মাল্টিলিব lib32asan5 lib32atomic1 lib32gcc-8-dev lib32gomp1 lib32itm1 lib32mpx2 lib32quadmath0 lib32stdc ++ - 8-dev lib32ubsan1 libb66cbc6 -i386 libc6-dev-x32 libc6-i386 libc6-x32 libx32asan5 libx32atomic1 libx32gcc-8-dev libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ 6db প্যাকেজগুলি ++ পরামর্শ দিন 8-dbg glibc-doc নিম্নলিখিত নতুন প্যাকেজ ইনস্টল করা হবে:জি ++ - 8-মাল্টিলিব জি ++ - মাল্টিলিব জিসিসি -8-মাল্টিলিব জিসিসি-মাল্টিলিব লাইব 32 এসান 5 লিব 32 এটমিক 1 লিব 32 এমপি 32 লিবি 32 কোয়াডম্যাথ0 ​​লিব 32 এসডিসি 60+ এক্স -1-লিভ 32 আইসি 32 8-দেব libx32gcc1 libx32gomp1 libx32itm1 libx32quadmath0 libx32stdc ++ - 8-dev libx32stdc ++ 6 libx32ubsan1

এটির মতোই আপনার টার্মিনালে প্রদর্শিত হবে


0

আমার অভিজ্ঞতা থেকে, sudo apt-get install gcc-multilib g++-multilibসাহায্য। তবে আমার অন্য সমস্যাটি হ'ল আমি ডিরেক্টরিটি পরিষ্কার করতে ভুলে যাই যাতে এখনও আমি একই ত্রুটি পাই। এটাই প্রথমবারের মতো ঝনঝন বা চাবি ব্যবহার করা। সুতরাং আমি কেবল আমার মূল ডিরেক্টরিটি মুছুন এবং পুনরায় সংকলন করুন এবং এটি কাজ করে। আশা করি এটি আমার মতো কাউকে সহায়তা করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.