ডিফল্ট জিসিসি এবং জি ++ সংস্করণটি কীভাবে চয়ন করবেন?


206

সুতরাং আমি gcc-4.4 এবং gcc-4.3 ইনস্টল করেছি (জি ++ এর জন্য একই)। এখন পর্যন্ত যতটা আমার মনে আছে উবুন্টুতে একটি সরঞ্জাম রয়েছে যা আপনার জন্য সিমলিংকগুলি সেট করে যদি আপনি কেবল এটি চান যে কোন সংস্করণটি আপনি চান। তবে এটি নতুন সংস্করণে কাজ করছে বলে মনে হচ্ছে না, যা আমি হতাশাবোধ করি।

root@nexus:~# update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc.
root@nexus:~# update-alternatives --config cc
There is only one alternative in link group cc: /usr/bin/gcc
Nothing to configure.


root@nexus:~# dpkg -l | grep gcc | awk '{print $2}'
gcc
gcc-4.3
gcc-4.3-base
gcc-4.3-multilib
gcc-4.4
gcc-4.4-base
gcc-4.4-multilib
gcc-4.5-base
gcc-multilib
lib32gcc1
libgcc1

কোন ধারনা?


1
@ অলি যেমন ব্যাখ্যা করেছেন, এটি একটি খারাপ ধারণা। ডেবিয়ান-ডেভেল মেল তালিকা: "আমি মনে করি না যে বিকল্পগুলি সংস্করণের জন্য ব্যবহার করা উচিত example উদাহরণস্বরূপ, আমরা জিসিসির বিকল্পগুলি ব্যবহার করি না, পাইথনের জন্যও নয়" " list.debian.org/debian-devel/2014/06/msg00381.html
hmijail

1
ঠিক আছে, তাই কি না আপনি ভার্সন জন্য ব্যবহার করবেন?
উইলসি

উত্তর:


271

প্রথমে জিসিসি এবং জি ++ এর জন্য বর্তমান আপডেট-বিকল্প সেটআপটি মোছা:

sudo update-alternatives --remove-all gcc 
sudo update-alternatives --remove-all g++

প্যাকেজ ইনস্টল করুন

মনে হচ্ছে জিসিসি-৪.৩ এবং জিসিসি-৪.৪ উভয়ই বিল্ড-অপরিহার্য ইনস্টল করার পরে ইনস্টল করা আছে। তবে আমরা স্পষ্টভাবে নিম্নলিখিত প্যাকেজগুলি ইনস্টল করতে পারি:

sudo apt-get install gcc-4.3 gcc-4.4 g++-4.3 g++-4.4

বিকল্প ইনস্টল করুন

সিম্বলিক লিঙ্কস সিসি এবং সি ++ ডিফল্টরূপে ইনস্টল করা আছে। আমরা gcc এবং g ++ এর জন্য প্রতীক লিঙ্কগুলি ইনস্টল করব, তারপরে যথাক্রমে সিসি এবং সি ++ কে জিসিসি এবং জি ++ এর সাথে সংযুক্ত করব। (যে নোট 10, 20এবং 30অপশন প্রতিটি বিকল্প জন্য অগ্রাধিকার আছে।)

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.3 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 20

sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30
sudo update-alternatives --set cc /usr/bin/gcc

sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 30
sudo update-alternatives --set c++ /usr/bin/g++

বিকল্প কনফিগার করুন

শেষ পদক্ষেপটি জিসিসি, জি ++ এর জন্য ডিফল্ট কমান্ডগুলি কনফিগার করছে। ইন্টারেক্টিভভাবে 4.3 এবং 4.4 এর মধ্যে স্যুইচ করা সহজ:

sudo update-alternatives --config gcc
sudo update-alternatives --config g++

অথবা স্ক্রিপ্ট ব্যবহার করে স্যুইচ করুন:

#!/bin/sh

if [ -z "$1" ]; then
    echo "usage: $0 version" 1>&2
    exit 1
fi

if [ ! -f "/usr/bin/gcc-$1" ] || [ ! -f "/usr/bin/g++-$1" ]; then
    echo "no such version gcc/g++ installed" 1>&2
    exit 1
fi

update-alternatives --set gcc "/usr/bin/gcc-$1"
update-alternatives --set g++ "/usr/bin/g++-$1"

4
থেক্স, তাই আপনাকে আপডেটগুলি বিকল্পগুলিতে ম্যানুয়ালি যুক্ত করতে হবে .. আইআইআরসি এর আগের উবুন্টু সংস্করণগুলি স্বয়ংক্রিয়ভাবে তা করেছে।
নীল

1
এটি বিভিন্ন কার্নেলের জন্য এনভিডিয়া মডিউলগুলি সংকলন করার সময় আমার পক্ষে বিশেষত কার্যকর। আপডেট-বিকল্পগুলি ব্যাখ্যা করার জন্য আপনাকে অনেক ধন্যবাদ
EarthmeLon

1
ধন্যবাদ! আমি আপনার অন্যান্য উত্তরটি 4.6 থেকে 4.7 অবধি আপডেট করতে ব্যবহার করেছি। আমি এই উত্তরটি ব্যবহার করতে চেয়েছিলাম, তবে আমি নিশ্চিত ছিলাম না কেন আপনি কিছু আদেশের পরে আপনি 10 20 30 এর মতো নম্বর রাখেন। আপনি দয়া করে ব্যাখ্যা করতে পারেন?
মার্টিন দ্রোজডিক

7
সংখ্যাগুলি অগ্রাধিকার হিসাবে দেখা যাচ্ছে ম্যানপেজ অনুযায়ী। আমি মনে করি যে কোনও সংস্করণ আনইনস্টল করা হয়েছে তা কোনটি নতুন ডিফল্ট হওয়া উচিত তা নির্ধারণ করতে সেই অগ্রাধিকারগুলি ব্যবহার করবে।
ইব্রাহিম

1
@ ইব্রাহিম: না, আপনি যখন অটো মোড নির্বাচন করেন তখন তারা কী বেছে নিবে তা তারা নির্ধারণ করে
কুকি

41

টার্মিনালে চালানো:

gcc -v
g++ -v

ঠিক আছে, সুতরাং যে অংশ মোটামুটি সহজ। জটিল অংশটি হ'ল আপনি যখন জিসিসি কমান্ডটি প্রকাশ করবেন এটি আসলে একটি সিবোলিক লিঙ্ক যা আপনি কখন ব্যবহার করছেন জিসিসির সংস্করণ। এর অর্থ হ'ল আমরা জিসিসি থেকে জিসিসির যেকোন সংস্করণে একটি প্রতীকী লিঙ্ক তৈরি করতে পারি।

  • আপনি প্রতীকী লিঙ্কটি দেখতে পারেন:
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
  • সুতরাং আমাদের যা করা দরকার তা হ'ল জিসিসি সিমলিংক এবং জি ++ সিমলিংকটি সরিয়ে ফেলা এবং তারপরে তাদেরকে জিসিসি ৪.৩ এবং জি ++ ৪.৩ এর সাথে যুক্ত করুন:
rm /usr/bin/gcc
rm /usr/bin/g++

ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
ln -s /usr/bin/g++-4.3 /usr/bin/g++
  • এখন যদি আমরা আবার প্রতীকী লিঙ্কগুলি পরীক্ষা করি তবে আমরা দেখতে পাব যে জিসিসি এবং জি ++ এখন জিসিসি ৪.৩ এবং জি ++ ৪.৩ এর সাথে সংযুক্ত রয়েছে:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • শেষ পর্যন্ত আমরা আমাদের জিসিসি -v আবার যাচাই করতে পারি এবং নিশ্চিত করতে পারি যে আমরা সঠিক সংস্করণটি ব্যবহার করছি:
gcc -v
g++ -v

1
ঠিক আমি খুঁজছেন ছিল কি! "Gcc" কে যে সংস্করণ ইনস্টল করেছি তার সাথে সিমলিংক করার ক্ষমতা সম্পর্কে ভুলে গেছি। ধন্যবাদ!
কালেব এইচসি

আরও সহজ এবং সহজ এবং নিরাপদ পদ্ধতি!
sailfish009

21

এটি কি সত্যই কাম্য? gccসংস্করণগুলির মধ্যে এবিআই পরিবর্তন রয়েছে । একটি সংস্করণ (উদাহরণস্বরূপ পুরো অপারেটিং সিস্টেম) দিয়ে কিছু সংকলন করা এবং তারপরে অন্য সংস্করণ দিয়ে অন্য কিছু সংকলন করা দ্বন্দ্বের কারণ হতে পারে।

উদাহরণস্বরূপ, কার্নেল gccসংকলনের জন্য কার্নেল মডিউলগুলি সর্বদা একই সংস্করণের সাথে সংকলিত হওয়া উচিত । এই বিষয়টি মনে রেখে, আপনি যদি /usr/bin/gccউবুন্টুর সংস্করণে ব্যবহৃত সিমিলেঙ্ক এবং সংস্করণটির মধ্যে ম্যানুয়ালি পরিবর্তন করেন তবে ভবিষ্যতের ডিকেএমএস-নির্মিত মডিউলগুলি ভুল gccসংস্করণ ব্যবহার করতে পারে ।

আপনি যদি কেবল আলাদা সংস্করণ দিয়ে জিনিসগুলি তৈরি করতে চান তবে এটি gccএমনকি নকশাগুলি দিয়েও যথেষ্ট সহজ। উদাহরণস্বরূপ, যদি আপনি এর সংস্করণে পাস করতে পারেন gccমধ্যে CCএনভায়রনমেন্ট ভেরিয়েবল:

CC="gcc-4.5" ./configure
CC="gcc-4.5" make

মেক কমান্ডে আপনার এটির প্রয়োজন নাও হতে পারে (স্ক্রিপ্টগুলি সাধারণত এটিতে টানুন) তবে এটি ক্ষতি করে না।


1
আপনার মন্তব্যের জন্য ধন্যবাদ। আমি সিসি পরিবর্তনশীল সম্পর্কে সচেতন, কিন্তু এটি আসলে প্রশ্ন ছিল না।
নীল

2
যথেষ্ট সত্য তবে আমি ব্যাখ্যা করেছি যে কেন সিস্টেমের gccঅংশ নয় alternativesএবং কেন এটি বিশেষভাবে কাম্য নয়। যদি তাদের মধ্যে কেউ আপনার মত পরিবর্তন করে না থাকে তবে কেবল এটি ম্যানুয়ালি করুন।
অলি

1
এটা আগে ছিল? এখন তারা কি এটিকে সরিয়ে দিয়েছে ?! বিভিন্ন জিসিসি সংস্করণ সহ কম্পিউটার ব্যবহারকারীর স্পেসিফিকেশন পুরোপুরি ঠিক হওয়া উচিত .. এই আলোচনাটি শীতল হয়ে উঠছে ..
নীল

1
আপনি কি ব্যাখ্যা করতে পারেন যে প্রতি-অনুরোধ পরিবেশের ভেরিয়েবলগুলি সিস্টেম-প্রশস্ত কনফিগারেশন সেটিংয়ের চেয়ে কেন বেশি পছন্দযোগ্য? $ sudo apt-get install gcc-6 gcc-7 $ CC="gcc-7" ./configure <much output> $ make # uses gcc-7 যেখানে sudo update-alternatives gcc gcc-7নিশ্চিত করুন যে আপনি দূর্ঘটনাক্রমে Abis সুইচ না দিতেন।
কেএফসনে

14

সম্পাদনা:

এটি ধরে নিয়েছে যে আপনি উদাহরণটি সহ প্রথম সংস্করণটি ইনস্টল করেছেন:

sudo apt install gcc-4.9 g++-4.9

মূল:

এবং যারা অলস তাদের জন্য এখানে একটি ওয়ান-লাইনার রয়েছে, কেবলমাত্র আপনার পছন্দ অনুযায়ী সংস্করণটির শেষে নম্বরটি পরিবর্তন করুন। এটি gcc এবং / অথবা g ++ এর জন্য পরিবর্তন আনবে

ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9

এই উদাহরণে আমি 4.9 এ পরিবর্তন করেছি

কোনও ত্রুটি পরীক্ষা করা নেই এবং এই উদাহরণে কী নেই, তাই আপনি এটি চালানোর আগে কী চালানো হবে তা পরীক্ষা করতে পারেন। শুধু যোগ প্রতিধ্বনি আগে উবুন্টু । সম্পূর্ণতার জন্য আমি চেক লাইনটিও সরবরাহ করি:

ls -la /usr/bin/ | grep -oP "[\S]*(gcc|g\+\+)(-[a-z]+)*[\s]" | xargs bash -c 'for link in ${@:1}; do echo sudo ln -s -f "/usr/bin/${link}-${0}" "/usr/bin/${link}"; done' 4.9

চেক থেকে আউটপুট এমন কিছু হওয়া উচিত:

sudo ln -s -f /usr/bin/g++-4.9 /usr/bin/g++
sudo ln -s -f /usr/bin/gcc-4.9 /usr/bin/gcc
sudo ln -s -f /usr/bin/gcc-ar-4.9 /usr/bin/gcc-ar
sudo ln -s -f /usr/bin/gcc-nm-4.9 /usr/bin/gcc-nm
sudo ln -s -f /usr/bin/gcc-ranlib-4.9 /usr/bin/gcc-ranlib
sudo ln -s -f /usr/bin/x86_64-linux-gnu-g++-4.9 /usr/bin/x86_64-linux-gnu-g++
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-4.9 /usr/bin/x86_64-linux-gnu-gcc
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ar-4.9 /usr/bin/x86_64-linux-gnu-gcc-ar
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-nm-4.9 /usr/bin/x86_64-linux-gnu-gcc-nm
sudo ln -s -f /usr/bin/x86_64-linux-gnu-gcc-ranlib-4.9 /usr/bin/x86_64-linux-gnu-gcc-ranlib

আপনি এর সাথে সংস্করণটি চেক করতে পারেন:

gcc --version

আধা-বিস্তারিত ব্যাখ্যা:

  • ম -la / usr / bin / এ তালিকা সব ফাইল , / usr / বিন
  • | পাইপ (প্রেরণ) পরবর্তী কমান্ডে আউটপুট
  • গ্রেপ-ওপি প্রতি লাইনে অনুসন্ধানের রেজেক্সের সাথে মেলে। o কেবলমাত্র ফলাফলটি পুরো ম্যাচ করা লাইনটি দেখায় না। পি গ্রেপকে পার্ল-রেজেক্স ব্যবহার করতে বলে। আমি এখানে রেইজেক্সে যাব না, আপনি চাইলে এটি পড়ুন।
  • xargs সহজভাবে বললে, এটি এতে যে পাইপ করা হয় সেগুলি সংগ্রহ করে এবং সেগুলি সমস্ত শেষে প্রেরণ করে। অর্থাত xargs নিম্নলিখিত কমান্ড
  • bash ভাল, এটি ব্যাশ আছে। সেটির উপরে ফ্ল্যাগ লাগাতে বলে কমান্ড স্ট্রিং ব্যবহার করতে। এই উদাহরণে এটি প্রথম (0 তম) টি আর্গুমেন্ট এড়িয়ে জার্গার্স থেকে প্রেরিত আর্গুমেন্টগুলির উপরে লুপ করে , এই ক্ষেত্রে লুপটি 4.9 এড়িয়ে যায় । লিংকে পরিবর্তন করতে লুপটিতে 0 তম যুক্তি ব্যবহৃত হয়।
  • Ln -s -f গুলি পতাকা একটি সিম্বলিক লিঙ্ক, তোলে প্রথম লিঙ্ক মুক্ত করার প্রয়োজনে বাহিনী।

2
খুব পুরানো প্রশ্ন, তবে এই উত্তরটি পুরানো পোস্টগুলির উত্তরগুলি পর্যালোচনা করার সময় আমাদের উচিত সেই রত্নগুলির মধ্যে একটি বলে মনে হচ্ছে ...
mook765

উজ্জ্বল! সেরা উত্তর হাত!
গ্যাব্রিয়েল স্টেপলস

-1

অস্থায়ী ডিরেক্টরিতে একটি প্রতীকী লিঙ্ক সম্পর্কে কীভাবে:

mkdir x && PATH=$PWD/x:$PATH && ln -s /usr/bin/g++-7 $PWD/x/g++


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