GCC編譯之新老版本共存

2022-07-30 08:45:16 字數 4207 閱讀 8770

ubuntu公升級到了

12.04, gcc

也公升級到了

4.6.3

,重新編譯專案工程時發現許多以前的警告變成了錯誤,仔細一看**都是在取

c++的臨時變數位址做引數出錯,以前為了方便很多這樣的**

兩種改法:1.

改**,顯示定義乙個臨時變數,再取位址;2.加

fpermissive

做編譯引數。

前者工作量大,後者可能會忽略其他編譯錯誤,不可取。於是想到自己編乙個gcc 4.5.2

版本,構建此專案時用老版本,其他則用新版本。谷歌了下,下面是在

ubuntu12.04 64

位上構建

gcc的完整過程,摘自

,注意:

1. 32位系統請將 library_path=/usr/lib/x86_64-linux-gnu/,c_include_path=/usr/include/x86_64-linux-gnu, cplus_include_path=/usr/include/x86_64-linux-gnu,改為

library_path=/usr/lib/i386-linux-gnu/,c_include_path=/usr/include/i386-linux-gnu, cplus_include_path=/usr/include/i386-linux-gnu。最好將這些變數寫入~/.bashrc 。

2. 應嚴格按照下面的步驟,如果出錯,檢查是否遺漏步驟。

3. 取消自己構建版本gcc

使用系統自帶

gcc的方法是,從

path

變數中去掉對應

gcc版本的路徑。

本文將介紹如何在 ubuntu 12.04 下編譯 gcc 4.7,我很奇怪的是在 ubuntu 下編譯 gcc 原始碼也那麼複雜,不過 ubuntu 也是 linux 系統之一,就沒什麼好奇怪的了。

首先檢查你是否已經預設安裝 ubuntu gcc 和 binutils ,如果你使用了 64 位的桌面版本,那麼預設是已經安裝了。下面的部分我們建議你開啟乙個終端來執行相應的命令。

在此之前建議更新下系統,執行如下命令:

1sudo apt-get install update

2sudo apt-get install upgrade

接下來我們需要安裝一些所需的軟體包:

1sudo apt-get install g++

2sudo apt-get install

gawk

3sudo apt-get install m4

4sudo apt-get install gcc-multilib

然後選擇 gcc-4.7 的最新穩定版本,檔名是 gcc-4.7.0.tar.bz2. 將它儲存到本地。

你還需要另外三個庫才能成功編輯 gcc,這三個庫分別是:mpc

, mpfr

和 gmp

開啟終端進入上述幾個檔案所在的目錄:

1cd ~

2cd downloads

我們先開始編譯 gmp 庫

1cd gmp*

2mkdir build && cd build

3../configure --prefix=/usr/gcc_4_7 --build=x86_64-linux-gnu

4make

5sudo

make

install

幾分鐘後你將有乙個已編譯好和安裝好的 gmp 庫,如果一切順利,恭喜你!

使用相同的步驟來編譯 mpfr:

1cd ..

2cd ..

3cd mpfr*

4mkdir build && cd build

5../configure --build=x86_64-linux-gnu --prefix=/usr/gcc_4_7 --with-gmp=/usr/gcc_4_7

6make

7sudo

make

install

緊接著是 mpc:

1cd ..

2cd ..

3cd mpc*

4mkdir build && cd build

5../configure --build=x86_64-linux-gnu --prefix=/usr/gcc_4_7 --with-gmp=/usr/gcc_4_7 --with-mpfr=/usr/gcc_4_7

6make

7sudo

make

install

到這一步就完成個 gcc 所需包的編譯和安裝,在某些機器上這三者的編譯可能超過乙個小時,做好心理準備。

接下來我們可以開始編譯 c/c++ 和 fortran 編譯器:

01cd ..

02cd ..

03mkdir build && cd build

04export library_path=/usr/lib/x86_64-linux-gnu/

05export c_include_path=/usr/include/x86_64-linux-gnu

06export cplus_include_path=/usr/include/x86_64-linux-gnu

07../gcc-4.7.0/configure --build=x86_64-linux-gnu --prefix=/usr/gcc_4_7 --with-gmp=/usr/gcc_4_7 --with-mpfr=/usr/gcc_4_7 --with-mpc=/usr/gcc_4_7 --enable-checking=release --enable-languages=c,c++,fortran --disable-multilib --program-suffix=-4.7

08make

09sudo

ln -s /usr/lib/x86_64-linux-gnu /usr/lib64

10sudo

make

install

下面命令可將 gcc 4.7 新增到系統路徑中,或者直接編輯 .bashrc 檔案並在最後新增下面一行:

1export path=/usr/gcc_4_7/bin:$path

你不知道什麼是 .bashrc 檔案?沒關係,開啟終端執行:

1cd ~

2gedit .bashrc

1./.bashrc

下面是呼叫編譯器的簡單方法

1g++-4.7 test.cpp -o test

如果你的磁碟空間緊張,記得刪除原始碼檔案目錄下的 *build* 子目錄。

接下來我們檢查 g++-4.7 是否能編譯一些 c++11 規範的**,開啟你喜好的編輯器,複製下面一段**並保持該檔案為 tst_lambda.cpp:

view source

print?01

//program to test the new c++11 lambda syntax

02#include 

0304

using

namespace std;

0506

int main()

0708

cout << (int m, int n)  (2,4) << endl;

09return 0;

10編譯並執行上述 lambda

示例將返回 6:

1g++-4.7 -std=c++11 tst_lambda.cpp -o tst_lambda

2./tst_lambda

3g++-4.7 同時也支援 c++11 執行緒:

01//create a c++11 thread from the main program

0203

#include 

04#include 

0506

//this function will be called from a thread

07void call_from_thread() {

08std::cout << "hello, world!" << std::endl;

0910

11int main() {

12//launch a thread

13std::thread t1(call_from_thread);

1415

//join the thread with the main thread

16t1.join();

1718

return 0;

19

Dojo Grid同時支援新老版本

迫於諸多dojo1.1.1使用者的強烈要求,現在的dojo同時支援兩種grid 新版本grid 1.2 和老版本grid 1.1.1 現在的目錄結構有些奇怪 dojo dojox grid js 1.2的js 增加grid.js和virtualgrid.js是用於相容 dojo dojox grid...

grads 新老版本目錄對比

最近不少人都在使用opengrads,最新的版本已經更新到了2.0.a9,具體grads做了哪些更新,在附件裡面放了乙個,是英文的。很多人說在使用原來的一些教程的時候找不到相對應的資料夾了,其實仔細搜尋一下就能找到了,不過今天還是打算寫出來,供需要的人參考一下。原始的grads的資料夾大致有以下幾個...

GCC多版本共存

方法一 利用環境變數 方法二,鏈結 apt get install gcc 3.4 之後,你需要把usr bin 目錄下的gcc檔案刪除掉或者避免意外發生,可以把它命名為gcc.bak。這裡需要說明的如果你不刪除的話,你會 發現你使用ln s usr bin gcc 3.4 usr bin gcc總...