centos编译helloworld的几个小问题

1.GCC使用
在使用GCC编译程序时,编译过程能够被细分为四个阶段:
预处理(Pre-Processing)
编译(Compiling)汇编(Assembling)
连接(Linking)。
例如:     
#include 
int main(void)
{
       
printf ("Hello world, Linux programming!\n");
                  
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 hellolinux

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

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

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

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

四、链接阶段,一般会用g++来完成,这是由于gcc命令不能自动和c++程序使用的库链接。spa

 gcc能够用来编译c++可是它不会自动调用连接的c++库,你须要本身手动连接,使用以下命令: gcc -lstdc++main.cpp。g++则会自动调用连接的c++库。blog

gcc能够根据后缀名为.c或.cpp分别按c程序和c++程序来编译;可是g++不管是.c或.cpp都统一按c++程序来编译。
并且g++在编译的过程当中,实际上是调用gcc按照c++程序来编译的。即编译工做最终都是由gcc来完成的。
对于c++程序,由于gcc命令不能自动和C++程序使用的库联接,须要本身手动连接c++库,因此连接能够用g++或者gcc -lstdc++。也便是说c++程序,也能够用gcc来连接。ip

可是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++编译连接似的。get


误区二: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 之多。

一、下载源码

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

二、下载依赖包
编译安装 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。

三、编译安装

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 个小时左右)。

四、查看版本号

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.nlnl的功能和cat -n同样,一样是从第一行输出所有内容,而且把行号显示出来nl的语法:nl 文件名

相关文章
相关标签/搜索