zoukankan      html  css  js  c++  java
  • GCC编译之新老版本共存

    Ubuntu升级到了12.04, GCC也升级到了4.6.3,重新编译项目工程时发现许多以前的警告变成了错误,仔细一看代码都是在取C++的临时变量地址做参数出错,以前为了方便很多这样的代码

    两种改法:1.改代码,显示定义一个临时变量,再取地址;2.fpermissive做编译参数。

    前者工作量大,后者可能会忽略其他编译错误,不可取。于是想到自己编一个GCC 4.5.2版本,构建此项目时用老版本,其他则用新版本。谷歌了下,下面是在ubuntu12.04 64位上构建GCC的完整过程,摘自http://www.oschina.net/question/12_49423 ,注意:

    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 位的桌面版本,那么默认是已经安装了。下面的部分我们建议你打开一个终端来执行相应的命令。

    在此之前建议更新下系统,执行如下命令:

    1

    sudo apt-get install update

    2

    sudo apt-get install upgrade

    接下来我们需要安装一些所需的软件包:

    1

    sudo apt-get install g++

    2

    sudo apt-get install gawk

    3

    sudo apt-get install m4

    4

    sudo apt-get install gcc-multilib

    然后从 GNU 网站上下载最新的 gcc-4.7 源码,请访问 http://gcc.gnu.org/mirrors.html 然后选择 gcc-4.7 的最新稳定版本,文件名是 gcc-4.7.0.tar.bz2. 将它保存到本地。

    你还需要另外三个库才能成功编辑 gcc,这三个库分别是:mpcmpfr 和 gmp. 使用链接进入下载最新版本分别是:gmp-5.0.4.tar.bz2, mpc-0.9.tar.gz 和 mpfr-3.1.0.tar.gz ,并且保存到跟 gcc 4.7 源文件所在的同一个目录。

    打开终端进入上述几个文件所在的目录:

    1

    cd ~

    2

    cd Downloads

    我们先开始编译 gmp 库

    1

    cd gmp*

    2

    mkdir build && cd build

    3

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

    4

    make

    5

    sudo make install

    几分钟后你将有一个已编译好和安装好的 gmp 库,如果一切顺利,恭喜你!

    使用相同的步骤来编译 MPFR:

    1

    cd ..

    2

    cd ..

    3

    cd mpfr*

    4

    mkdir build && cd build

    5

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

    6

    make

    7

    sudo make install

    紧接着是 MPC:

    1

    cd ..

    2

    cd ..

    3

    cd mpc*

    4

    mkdir 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

    6

    make

    7

    sudo make install

    到这一步就完成个 gcc 所需包的编译和安装,在某些机器上这三者的编译可能超过一个小时,做好心理准备。

    接下来我们可以开始编译 C/C++ 和 Fortran 编译器:

    01

    cd ..

    02

    cd ..

    03

    mkdir build && cd build

    04

    export LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/

    05

    export C_INCLUDE_PATH=/usr/include/x86_64-linux-gnu

    06

    export 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

    08

    make

    09

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

    10

    sudo make install

    下面命令可将 gcc 4.7 添加到系统路径中,或者直接编辑 .bashrc 文件并在最后添加下面一行:

    1

    export PATH=/usr/gcc_4_7/bin:$PATH

    你不知道什么是 .bashrc 文件?没关系,打开终端执行:

    1

    cd ~

    2

    gedit .bashrc

    使用下面命令重新加载 .bashrc 文件:

    1

    ./.bashrc

    下面是调用编译器的简单方法

    1

    g++-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 <iostream>

    03

    04

    using namespace std;

    05

    06

    int main()

    07

    {

    08

        cout << [](int m, int n) { return m + n;} (2,4) << endl;

    09

        return 0;

    10

    }

    编译并运行上述 lambda 示例将返回 6:

    1

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

    2

    ./tst_lambda

    3

    6

    g++-4.7 同时也支持 C++11 线程:

    01

    //Create a C++11 thread from the main program

    02

    03

    #include <iostream>

    04

    #include <thread>

    05

    06

    //This function will be called from a thread

    07

    void call_from_thread() {

    08

        std::cout << "Hello, World!" << std::endl;

    09

    }

    10

    11

    int main() {

    12

        //Launch a thread

    13

        std::thread t1(call_from_thread);

    14

    15

        //Join the thread with the main thread

    16

        t1.join();

    17

         

    18

        return 0;

    19

    }

  • 相关阅读:
    Spring Richclient — 企业级富客户端开发框架介绍,第 1 部分
    oracle的表名、字段名、constraint名的长度限制分别是多少?
    eclipse指定启动的jdk
    女人为什么爱攀比?
    Oracle一些常用的查询命令总结(持续更新)
    js冒泡事件之之之
    Aspose插件
    oracle11g导入到10g
    转:OpenCms 9.0.1汉化
    metasploit常用命令
  • 原文地址:https://www.cnblogs.com/persistentsnail/p/3294857.html
Copyright © 2011-2022 走看看