zoukankan      html  css  js  c++  java
  • centos编译helloworld的几个小问题

    1.GCC使用
    在使用GCC编译程序时,编译过程可以被细分为四个阶段:
    预处理(Pre-Processing)
    编译(Compiling)汇编(Assembling)
    链接(Linking)。
    例如:     
    #include 
    int main(void)
    {
           
    printf ("Hello world, Linux programming! ");
                      
    return 0;
    }
        然后执行下面的命令编译和运行这段程序:
    # gcc hello.c -o hello
    #
    ./hello
    Hello world, Linux programming!
       
    GCC需要调用预处理程序cpp,由它负责展开在源文件中定义的宏,并向其中插入“#include”语句所包含的内容;接着,GCC会调用ccl和as将处理后的源代码编译成目标代码;最后,GCC会调用链接程序ld,把生成的目标代码链接成一个可执行程序。
       
    第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程:
    #  gcc -E hello.c -o
    hello.i
       
    此时若查看hello.cpp文件中的内容,会发现stdio.h的内容确实都插到文件里去了,而其它应当被预处理的宏定义也都做了相应的处理。下一步是将hello.i编译为目标代码,这可以通过使用-c参数来完成:
    #  gcc -c hello.i -o
    hello.o
       
    GCC默认将.i文件看成是预处理后的C语言源代码,因此上述命令将自动跳过预处理步骤而开始执行编译过程,也可以使用-x参数让GCC从指定的步骤开始编译。最后一步是将生成的目标文件链接成可执行文件:
    #  gcc hello.o -o hello

    2.gcc和g++都是GNU(一个组织)的编译器。

    1、对于.c后缀的文件,gcc把它当做是C程序;g++当做是C++程序;

    2、对于.cpp后缀的文件,gcc和g++都会当做c++程序。

    3、编译阶段,g++会调用gcc(也就是说);

    4、连接阶段,通常会用g++来完成,这是因为gcc命令不能自动和c++程序使用的库连接。

     gcc可以用来编译c++但是它不会自动调用链接的c++库,你需要自己手动链接,使用如下命令: gcc -lstdc++main.cpp。g++则会自动调用链接的c++库。

    gcc可以根据后缀名为.c或.cpp分别按c程序和c++程序来编译;但是g++无论是.c或.cpp都统一按c++程序来编译。
    而且g++在编译的过程中,其实是调用gcc按照c++程序来编译的。即编译工作最终都是由gcc来完成的。
    对于c++程序,因为gcc命令不能自动和C++程序使用的库联接,需要自己手动链接c++库,所以链接可以用g++或者gcc -lstdc++。也即是说c++程序,也可以用gcc来链接。

    但是gcc在编译c程序的时候,它会自动链接c库的。

    误区一:gcc只能编译c代码,g++只能编译c++代码
    两者都可以,但是请注意:
    1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
    2.编译阶段,g++会调用gcc。对于c++代码,可以用gcc或g++来编译,二者等价的。
    3 链接阶段,因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接。一般为了方便,干脆编译和链接都用g++了。这就给人一种错觉,好像cpp程序只能用g++编译链接似的。


    误区二:gcc不会定义__cplusplus宏,而g++会
    实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

    误区三:编译只能用gcc,链接只能用g++
    严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

    3.GCC升级问题

    关于 GCC 在 CentOS 下通过 yum 安装默认版本号,CentOS 5 是 4.1.2;CentOS 6 是 4.4.7;CentOS 7 是 4.8.3。
    很多时候在编译安装软件都需要高版本的 GCC,否则就会报错。
    那么如何升级 GCC 的版本呢?

    首先要确认升级到的 GCC 版本号。
    目前 GCC 的最新版已经到了 5.2,而 CentOS 7 则依然使用其 4.8,所以基于兼容性考虑,我选择升级到 4.8.5。
    GCC 官网:https://gcc.gnu.org

    下面开始一步一步来编译安装 GCC 4.8.5,需要注意的是,在编译安装 GCC 之前,系统里必须先要通过 yum 安装老版本的 GCC 和依赖库。
    如果是在 x86_64 系统下编译的话,还需要安装 libgcc.i686 glibc-devel.i686 才行。

    yum install -y gcc texinfo-tex flex zip libgcc.i686 glibc-devel.i686

    当然,如果是在 CentOS 5 x86_64 系统下安装,则是如下命令:

    yum install -y gcc texinfo-tex flex zip libgcc.i386 glibc-devel.i386

    同时需注意,编译安装 GCC 内存不小于 1GB,Swap 不小于 1GB,硬盘最低不小于 10GB,否则极有可能会中途报错退出。
    编译安装完后,目录 gcc-4.8.5 将会有 5GB 之多。

    1、下载源码

    wget ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz

    2、下载依赖包
    编译安装 GCC 需要依赖 mpc,mpfr,gmp包。好在 GCC 源码里自带脚本可以轻松下载依赖包。

    tar zxf gcc-4.8.5.tar.gz
    cd gcc-4.8.5
    ./contrib/download_prerequisites

    在此脚本里可以看到依赖包的版本号依次是 mpc-0.8.1,mpfr-2.4.2,gmp-4.3.2。

    3、编译安装

    mkdir gcc-build-4.8.5
    cd gcc-build-4.8.5
    ../configure --prefix=/usr
    make && make install

    为了避免安装后系统里出现多个版本的 GCC,这里直接将编译安装的目录指定为 /usr,如果不指定 –prefix,则会默认安装到 /usr/local 下。
    GCC 4.8.5 光是源代码就有105MB,因此可以预见整个编译过程需要很长时间(差不多 2 个小时左右)。

    4、查看版本号

    gcc --version
    gcc (GCC) 4.8.5
    
    g++ --version
    g++ (GCC) 4.8.5
    
    which gcc
    /usr/bin/gcc
    
    which g++
    /usr/bin/g++

    注:本次是在 CentOS 6.7 x86_64 下安装成功。

    4。CentOS查看文件的几种方式

    有许多命令都可以查看文件,不同的命令有不同的优点,可以针对不同的需要分别选择命令以提高效率:
       cat     由第一行开始显示内容,并将所有内容输出
       tac     从最后一行倒序显示内容,并将所有内容输出
       more    根据窗口大小,一页一页的现实文件内容
       less    和more类似,但其优点可以往前翻页,而且进行可以搜索字符
       head    只显示头几行
       tail    只显示最后几行
       nl      类似于cat -n,显示时输出行号
    我使用最多的是more和less!

    1.cat 与 tac
    cat的功能是将文件从第一行开始连续的将内容输出在屏幕上。但是cat并不常用,原因是当文件大,行数比较多时,屏幕无法全部容下时,只能看到一部分内容。

    cat语法:cat [-n]  文件名
    参数说明:-n : 显示时,连行号一起输出

    tac语法:tac 文件名

    2.more和less(推荐使用)
    相对于cat和tac来说,more和less很好用。

    more的功能是将文件从第一行开始,根据输出窗口的大小,适当的输出文件内容。
    当一页无法全部输出时,可以用“回车键”向下翻3行(我的环境是3行,其他linux版本可能不同),或者使用“空格键”向下翻页。
    退出查看页面,请按“q”键。
    另外,more还可以配合管道符“|”(pipe)使用,例如:ls -al | more

    3.head和tail
    head和tail通常使用在只需要读取文件的前几行或者后几行的情况下使用。

    head的功能是显示文件的前几行内容
    head的语法:
    head 【-n number】 文件名

    4.nl
    nl的功能和cat -n一样,同样是从第一行输出全部内容,并且把行号显示出来

    nl的语法:
    nl 文件名

  • 相关阅读:
    2016521-Java-第八周学习总结
    20165221 第七周学习总结
    20165221—JAVA第六周学习心得
    20165221 JAVA第五周学习心得
    20165221 JAVA第四周学习心得
    结对学习创意照
    20165331 第三周学习总结
    20165331 课下作业
    20165331 第二周学习总结
    20165331 第一周学习总结
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/5650683.html
Copyright © 2011-2022 走看看