පෙරනිමි gcc සහ g ++ අනුවාදය තෝරා ගන්නේ කෙසේද?


229

එබැවින් මම gcc-4.4 සහ gcc-4.3 ස්ථාපනය කර ඇත (g ++ සඳහා සමාන වේ). දැන් මට මතක ඇති පරිදි උබුන්ටු හි මෙවලමක් තිබේ, එය ඔබට අවශ්‍ය අනුවාදය කිව්වොත් ඔබට සමමුහුර්ත සැකසෙනු ඇත. කෙසේ වෙතත් එය නවතම අනුවාදයේ වැඩ කරන බවක් නොපෙනේ.

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

අදහස් තිබේද?


2
@ ඔලි පැහැදිලි කළ පරිදි මෙය නරක අදහසකි. ඩේබියන්-ඩෙවල් තැපැල් ලැයිස්තුව: "අනුවාදකරණය සඳහා විකල්ප භාවිතා කළ යුතු යැයි මම නොසිතමි. උදාහරණයක් ලෙස, අපි gcc සඳහා විකල්ප භාවිතා නොකරමු, පයිතන් සඳහා ද භාවිතා නොකරමු." list.debian.org/debian-devel/2014/06/msg00381.html
hmijail ශෝකයෙන් ඉල්ලා අස්වූ අය

2
හරි, ඒ දේ කරන්නේ ඔබ අනුවාද සඳහා භාවිතා?
විල්සී

Answers:


300

පළමුවෙන්ම වත්මන් update-alternativesසැකසුම මකා දමන්න gccසහ g++:

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

පැකේජ ස්ථාපනය කරන්න

ඒ දෙකම ඇති බව පෙනේ gcc-4.3සහ gcc-4.4පසු ගොඩ නැඟීමට අත්යවශ්ය ස්ථාපනය ස්ථාපනය කෙරේ. කෙසේ වෙතත්, අපට පහත පැකේජ පැහැදිලිව ස්ථාපනය කළ හැකිය:

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

විකල්ප ස්ථාපනය කරන්න

සංකේතාත්මක සබැඳි ccසහ c++පෙරනිමියෙන් ස්ථාපනය කර ඇත. අප සඳහා සංකේතය සබැඳි ස්ථාපනය කරනු ඇත gccසහ g++, එසේ නම් සබැඳෙයි ccහා c++කිරීමට 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++

විකල්ප වින්‍යාස කරන්න

පසුගිය පියවර සඳහා පෙරනිමි විධාන වින්යාස කිරීම වේ gcc, 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
ස්තූතියි, එබැවින් ඔබ ඒවා යාවත්කාලීන-විකල්ප සඳහා අතින් එකතු කළ යුතුය .. IIRC පෙර උබුන්ටු අනුවාද එය ස්වයංක්‍රීයව සිදු කළේය.
නිල්ස්

1
විවිධ කර්නල් සඳහා එන්වීඩියා මොඩියුල සම්පාදනය කිරීමේදී මෙය මට විශේෂයෙන් ප්‍රයෝජනවත් වේ. යාවත්කාලීන විකල්ප පැහැදිලි කිරීම ගැන ඔබට බොහෝම ස්තූතියි
earthmeLon

1
ඔබට ස්තුතියි! 4.6 සිට 4.7 දක්වා යාවත්කාලීන කිරීමට මම ඔබේ අනෙක් පිළිතුර භාවිතා කළෙමි. මට මෙම පිළිතුර භාවිතා කිරීමට අවශ්‍ය විය, නමුත් ඔබ සමහර විධානයන්ට පසුව 10 20 30 වැනි අංක තබන්නේ මන්දැයි මට විශ්වාස නැත. කරුණාකර ඔබට පැහැදිලි කළ හැකිද?
මාටින් ඩ්‍රොස්ඩික්

7
මෑන් පිටුවට අනුව සංඛ්‍යා ප්‍රමුඛතා වේ. එක් අනුවාදයක් අස්ථාපනය කර ඇති විට එය නව පෙරනිමිය බවට පත්විය යුත්තේ කුමක් දැයි තීරණය කිරීමට එම ප්‍රමුඛතා භාවිතා කරනු ඇතැයි මම සිතමි.
ඉබ්‍රාහිම්

1
Bi ඉබ්‍රාහිම්: නැත, ඔබ ස්වයංක්‍රීය මාදිලිය තෝරාගැනීමේදී තෝරාගත යුත්තේ කුමක්ද යන්න ඔවුන් තීරණය කරයි
කුකී

47

පර්යන්තයේ ක්‍රියාත්මක කරන්න:

gcc -v
g++ -v

හරි, ඒ නිසා එම කොටස තරමක් සරලයි. උපායශීලී කොටස නම්, ඔබ GCC විධානය නිකුත් කරන විට එය ඇත්ත වශයෙන්ම ඔබ භාවිතා කරන GCC හි ඕනෑම සංස්කරණයක් සඳහා වූ සංකේතාත්මක සබැඳියකි. මෙයින් අදහස් කරන්නේ අපට අවශ්‍ය ඕනෑම ජීසීසී අනුවාදයකට සංකේතාත්මක සම්බන්ධතාවයක් නිර්මාණය කළ හැකි බවයි.

  • සංකේතාත්මක සබැඳිය ඔබට දැකිය හැකිය:
ls -la /usr/bin | grep gcc-4.4
ls -la /usr/bin | grep g++-4.4
  • එබැවින් අප කළ යුත්තේ ජීසීසී සිම්ලින්ක් සහ ජී ++ සිම්ලින්ක් ඉවත් කර ජීසීසී 4.3 සහ ජී ++ 4.3 සමඟ සම්බන්ධ කර නැවත ප්‍රතිනිර්මාණය කිරීමයි.
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++
  • දැන් අපි සංකේතාත්මක සබැඳි නැවත පරීක්ෂා කළහොත් අපට පෙනෙනුයේ GCC සහ G ++ දැන් GCC 4.3 සහ G ++ 4.3 සමඟ සම්බන්ධ වී ඇති බවයි:
ls -la /usr/bin/ | grep gcc
ls -la /usr/bin/ | grep g++
  • අවසාන වශයෙන් අපට අපගේ GCC -v නැවත පරීක්ෂා කර නිවැරදි අනුවාදය භාවිතා කරන බවට වග බලා ගත හැකිය:
gcc -v
g++ -v

1
හරියටම මම සොයන දේ! මා ස්ථාපනය කර ඇති ඕනෑම අනුවාදයකට "gcc" සමමුහුර්ත කිරීමේ හැකියාව ගැන අමතක වී ඇත. ස්තූතියි!
CalebHC

වඩාත් සරල හා පහසු සහ ආරක්ෂිත ක්‍රමය!
sailfish009

21

මෙය සැබවින්ම සුදුසු ද? gccඅනුවාද අතර ABI වෙනස්කම් තිබේ . එක් අනුවාදයක් සමඟ යමක් සම්පාදනය කිරීම (උදා: සමස්ත මෙහෙයුම් පද්ධතියම) සහ වෙනත් අනුවාදයක් සමඟ වෙනත් දෙයක් සම්පාදනය කිරීම ගැටුම් ඇති කළ හැකිය.

උදාහරණයක් ලෙස, කර්නල් මොඩියුල සෑම විටම gccකර්නලය සම්පාදනය කිරීම සඳහා භාවිතා කරන එකම අනුවාදය සමඟ සම්පාදනය කළ යුතුය . එය සිහියේ තබාගෙන, ඔබ /usr/bin/gccඋබුන්ටු අනුවාදය අතර ඇති සමමුහුර්තකරණය සහ අනුවාදය අතින් වෙනස් කළහොත් , අනාගත ඩීකේඑම්එස් විසින් සාදන ලද මොඩියුලයන් වැරදි gccඅනුවාදය භාවිතා කරනු ඇත.

ඔබට වෙනත් අනුවාදයක් සමඟ දේවල් තැනීමට අවශ්‍ය නම් gcc, එය සෑහෙන තරම් පහසුය, පිටපත් සමඟ වුවද. උදාහරණයක් ලෙස, ඔබ අනුවාදය උරුම විය හැකි gccතුළ CCපරිසර විචල්ය:

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

Make විධානය මත ඔබට එය අවශ්‍ය නොවනු ඇත (වින්‍යාස වින්‍යාස කිරීම සාමාන්‍යයෙන් එය තුළට අදින්න) නමුත් එය හානියක් නොවේ.


1
ඔබගේ අදහස් දැක්වීම සඳහා ස්තූතියි. CC විචල්‍යය ගැන මම දනිමි, නමුත් මෙය ඇත්ත වශයෙන්ම ප්‍රශ්නය නොවේ.
නිල්ස්

2
ඇත්ත නමුත් මම පද්ධතියේ gccකොටසක් alternativesනොවන්නේ ඇයි සහ මෙය විශේෂයෙන් සුදුසු නොවන්නේ මන්දැයි මම පැහැදිලි කර ඇත්තෙමි . ඒ දෙකම ඔබේ මනස වෙනස් නොකරන්නේ නම්, එය අතින් කරන්න.
ඔලි

1
එය මීට පෙරද? දැන් ඔවුන් එය ඉවත් කළාද? විවිධ gcc අනුවාදයන් සහිත (පරිශීලක අවකාශය) මෘදුකාංග සම්පාදනය කිරීම හොඳින් විය යුතුය .. මෙම සාකච්ඡාව ප්‍රත්‍යක්‍ෂ වේ ..
නිල්

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 මාරු නොවන බවට වග කළ හැකි වනු ඇත.
kfsone

16

සංස්කරණය කරන්න:

මෙය උපකල්පනය කරන්නේ ඔබ පළමුව අනුවාදය ස්ථාපනය කර ඇති බවයි, උදා:

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 වෙත මාරු වීමි

දෝෂ චෙක්පත් නොමැති අතර මෙම උදාහරණයේ නොමැති දේ, එබැවින් ඔබ එය ක්‍රියාත්මක කිරීමට පෙර ක්‍රියාත්මක වන්නේ කුමක් දැයි පරීක්ෂා කිරීමට ඔබට අවශ්‍ය විය හැකිය. යන්තම් එකතු සුප්රසිද්ධ echo විධානය පෙර කිසිදිනක භාවිතා . සම්පූර්ණත්වය සඳහා මම චෙක් රේඛාවද සපයමි:

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

අර්ධ සවිස්තරාත්මක පැහැදිලි කිරීම:

  • ls -la / usr / bin / ලැයිස්තු සියලු ගොනු / usr / bin
  • | නල (යැවීම) ප්‍රතිදානය ඊළඟ විධානයට
  • grep -oP එක් පේළියකට සෙවුම් රීජෙක්ස් සමඟ ගැලපේ. o ප්‍රති the ලය පෙන්වන්නේ සම්පූර්ණ ගැලපෙන රේඛාව නොවේ. පී grep ට පවසන්නේ perl-regex භාවිතා කරන ලෙසයි. මම මෙහි රීජෙක්ස් වෙත නොයන්නෙමි, ඔබට අවශ්‍ය නම් එය කියවන්න.
  • xargs සරලව කිවහොත්, එය නල මාර්ගයේ ප්‍රති results ල රැස්කර ඒවා සියල්ලම අවසානයට යවයි. එනම් xargs පහත දැක්වෙන විධානයට
  • bash හොඳින්, එය bash ය. මෙම ධජය ආඥාවක් ලෙස වැල භාවිතා කිරීමට එය කියයි. මෙම උදාහරණයේ දී එය පළමු (0 වන) තර්කය මඟ හැර xargs වෙතින් යවන ලද තර්ක විතර්ක කරයි, මේ අවස්ථාවේ දී ලූපය මඟ හැරේ 4.9 . සබැඳිය වෙනස් කිරීම සඳහා 0 වන තර්කය ලූපයේ භාවිතා වේ.
  • LN -s -f මෙම ගේ ධජය සංකේතාත්මක පුරුකක්, කරයි අවශ්ය නම් පළමු unlinking හමුදා.

2
ඉතා පැරණි ප්‍රශ්නයක්, නමුත් මෙම පිළිතුර පැරණි ලිපි වලට පිළිතුරු සමාලෝචනය කිරීමේදී අප සොයා බැලිය යුතු මැණික් වලින් එකක් ලෙස පෙනේ ...
mook765

දීප්තිමත්! හොඳම පිළිතුර අත් පහලට!
ගේබ්‍රියෙල් ස්ටැපල්ස්

1

තාවකාලික නාමාවලියක සංකේතාත්මක සබැඳියක් කෙසේද:

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


1
මට පිළිගත යුතුයි: මෙය විශිෂ්ට පිළිතුරකි.
user643722

1

මම සාමාන්‍යයෙන් අදාළ gcc මෙවලම් ( gcc-ar, ...) දාසයන් ලෙස වින්‍යාස කරමි , එවිට ඔබට ඒ සියල්ල එකවර මාරු කළ හැකිය:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.3 10 \
    --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.3 \
    --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.3 \
    --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.3

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 20 \
    --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.4 \
    --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.4 \
    --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.4
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 --config gcc
sudo update-alternatives --config g++
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.