CentOS 6.6 升級GCC G++ (當前最新版本為v6.1.0) (完整)


摘要:
  • 介紹CentOS系統下安裝G++6.1環境
  • 補充說明(用多線程程序來驗證)

 
安裝g++,在root 權限下,執行下面的命令
  yum install gcc-c++

 

CentOS 6.6 升級GCC G++ (當前最新GCC/G++版本為v6.1.0)
沒有便捷方式,
yum update....   yum install
或者 添加yum 的 repo 文件 也不行, 只能更新到 4.4.7!
then,  只能手動編譯安裝了,那么開始第一步 下載源代碼吧,GO! 

 
 
1、 獲取安裝包並解壓
 
tar -jxvf gcc-6.1.0.tar.bz2
 
當然, http://ftp.gnu.org/gnu/gcc  里面有所有的gcc版本供下載,最新版本已經有6.1.0啦.
建議下載.bz2的壓縮包,文件更小,下載時間更少.
 
2、 下載供編譯需求的依賴項
參考文獻[1]中說:這個神奇的腳本文件會幫我們下載、配置、安裝依賴庫,可以節約我們大量的時間和精力。
cd gcc-6.1.0
./contrib/download_prerequisites 
 
3、 建立一個目錄供編譯出的文件存放
mkdir gcc-build-6.1.0
cd gcc-build-6.1.0
 
4、 生成Makefile文件
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
 
5、 編譯
make -j4
-j4選項是make對多核處理器的優化,如果不成功請使用 make,相關優化選項可以移步至參考文獻[2]。
(注意:此步驟非常耗時,我虛擬機耗時近3小時; 實體機近80分鍾,CPU基本是滿的,內存也使用不少)
 
6、 安裝
make install
(安裝需要root權限!)
查看安裝
ls /usr/local/bin | grep gcc
 
7、 重啟,然后查看gcc版本
gcc -v
 
8、 寫個C++11 特性的程序段 測試
tryCpp11.cc 代碼省略....
g++ -std=c++11 -o tryCpp11 tryCpp11.cc
 
9、升級gcc,生成的動態庫沒有替換老版本gcc的動態庫
源碼編譯升級安裝了gcc后,編譯程序或運行其它程序時,有時會出現類似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found的問題。這是因為升級gcc時,生成的動態庫沒有替換老版本gcc的動態庫導致的,將gcc最新版本的動態庫替換系統中老版本的動態庫即可解決。
 
9.1 運行以下命令檢查動態庫:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
從輸出可以看出,gcc的動態庫還是舊版本的。說明出現這些問題,是因為升級gcc時,生成的動態庫沒有替換老版本gcc的動態庫。
 
9.2 執行以下命令,查找編譯gcc時生成的最新動態庫:
find / -name "libstdc++.so*"
 
在centos7下面,需要添加  -xdev 過濾
find  /  -xdev  -name "libstdc++.so*"
 
將上面的最新動態庫libstdc++.so.6.0.22復制到/usr/lib64目錄下
cd /usr/lib64
cp /root/Downloads/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 ./
 
9.3 刪除原來軟連接:
rm -rf libstdc++.so.6
 
9.4 將默認庫的軟連接指向最新動態庫:
ln -s libstdc++.so.6.0.22 libstdc++.so.6
 
9.5 默認動態庫升級完成。重新運行以下命令檢查動態庫:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
可以看到 輸出有"GLIBCXX_3.4.21" 了
 
 
[注:摘抄自 http://www.linuxidc.com/Linux/2015-01/112595.htm,   http://itbilu.com/linux/management/NymXRUieg.html, 原作者編譯有出錯過,但是我編譯沒有出錯過]
 
 
 
 
 
 
!!!且慢!!!:
添加環境變量
 
Now put the gcc in path
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH

請參考  https://www.cnblogs.com/music-liang/p/11889602.html    這篇文章,將環境變量永久添加到路徑中。

 

 
 
 
 
 
G++升級之后,lib64快捷方式修改
 
1.安裝g++                                            
2.更新到最新版本g++                                    
3.修改 lib64文件夾下面某個庫文件的鏈接                         
4.eg: g++  Demo.cpp  -o Demo.bin -std=c++11  -pthread         
編譯Demo.cpp文件,生成 Demo.bin文件, 用的C++11最新編程,如果有線程,還需要 -pthread 選項     
 
配置好本地  lib64文件夾下面的鏈接!!!(否則運行會報錯、提示某個版本的庫文件不是最新版本)
----
updatedb
-----查看
locate libstdc++.so.6
rm /usr/lib64/libstdc++.so.6
ln -s /usr/local/lib64/libstdc++.so.6.0.22  /usr/lib64/libstdc++.so.6
 
///////測試C++11特性的2個Demo
 
 
#include <iostream>
#include <thread>
 
void hello()
{
    std::cout<<"Hello Concurrent World\n";
}
 
int main()
{
    std::thread t(hello);
    t.join();
}
 

 

#include <iostream>
#include <vector>
#include <unistd.h>
using namespace std;
typedef unsigned char       BYTE;
 
int main()
{
vector<int> int_vec;
int_vec.push_back(1);
int_vec.push_back(2);
int_vec.push_back(3);
int_vec.push_back(4);
 
for(auto v : int_vec)
{
cout << v << "----hello C++11. -std=c++11 "<< getpid() << endl;
}
 
    BYTE  bt1 = 0x81;
    BYTE  bt2 = 0xEE;
 
    int itest1 = 0x01;
    int itest2 = 0xFF;
    int itest3 = bt1;
    int itest4 = bt2;
    cout << "itest1=" << itest1 << ", itest2=" << itest2 << ", itest3=" << itest3 << ", itest4=" << itest4 << endl;
 
 
return 0;
}
 
 

 

 
 
////////////  g++ chap1-1.cpp -std=c++11 -pthread -o abc.bin
 
 
#include <iostream>
#include <thread>
#include <unistd.h>
#include <vector>
using namespace std;
 
void MyThread(int iPara)
{
    cout<<"MyThread----: "<< iPara <<endl;
    sleep(1); ///The para is Seconds
}
 
int main()
{
    thread  threadDemo(MyThread, 123);
    cout <<"-----------start"<<endl;
    threadDemo.join();
    cout <<"-----------end"<<endl;
    
    vector<int> vecTest;
    vecTest.clear();
    vecTest.push_back(10);
    vecTest.push_back(20);
    vecTest.push_back(30);
    vecTest.push_back(40);
    vecTest.push_back(50);
    vecTest.push_back(1);
    vecTest.push_back(2);   
    for(auto  &changeValue:vecTest)
    {
        changeValue = changeValue * 2;
    }
    ////////////
    //
    cout<<"display new value:"<<endl;
    for(auto newValue:vecTest)
    {
        cout << newValue<<endl;
    }
    return 0;
}
 
 
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM