上一篇文章Linux下C++的编程——开偏介绍中我们已经介绍了GUN、GCC、G++等一些重要的概念,现在应该开始动手实践了!
开发工具的安装
环境
Distributions版本:CentOS 6.7
Linux内核片:2.6.32-573.3.1.el6.i686
一般Linux安装完之后默认就已经安装了GCC(GNU Compiler Collection),你可以查看一下gcc和g++的版本号检查gcc和g++是否已经安装。
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">[luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> ~]<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>gcc -v gcc version <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4.4</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20120313</span> (<span class="hljs-constant" style="box-sizing: border-box;">Red</span> <span class="hljs-constant" style="box-sizing: border-box;">Hat</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4.4</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span>) (<span class="hljs-constant" style="box-sizing: border-box;">GCC</span>) [luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> ~]<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>g++ -v gcc version <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4.4</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20120313</span> (<span class="hljs-constant" style="box-sizing: border-box;">Red</span> <span class="hljs-constant" style="box-sizing: border-box;">Hat</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4.4</span>.<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">16</span>) (<span class="hljs-constant" style="box-sizing: border-box;">GCC</span>) </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>
如果未安装,在Linux系统链接网络的时候可通过以下命令安装开发工具集:
<code class="hljs bash has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">yum groupinstall <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Development Tools"</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
第一个HelloWorld程序
说到程序,第一个肯定就是HelloWorld,那我们也从HelloWorld开始吧,写一个最简单的Hello程序,并编译和运行。
编写第一个程序
<code class="hljs mel has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">[luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> Cplusplus]$ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">pwd</span> /home/luowf/<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">workspace</span>/Cplusplus <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//在vim中编写第一个HelloWorld程序</span> [luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> Cplusplus]$ vim HelloWorld.cpp <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> #include <iostream> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main() <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> { <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span> std::cout << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Hello Wolrd!"</span> << std::endl; <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span> } <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//编译程序</span> [luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> Cplusplus]$ g++ HelloWorld.cpp [luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> Cplusplus]$ <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ls</span> a.out HelloWorld.cpp test1 test2 [luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> Cplusplus]$ ./a.out Hello Wolrd! [luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> Cplusplus]$</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li></ul>
g++与gcc的区别
在上一篇文章中其实已经分别介绍了gcc和g++,说gcc是C的编译器,g++是C++的编译器。那是不是说gcc只能编译编译C语言,而g++只能编译C++呢?其实不是,gcc也可以编译C++程序,而C++是C的基础上发展而来的,所以g++也不可能编译不了C语言。它们之间的区别有如下几点:
1. 后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序。注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,C++的语法规则更加严谨一些。
2. 编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。用gcc进行编译,在选项中加上要链接的库,也可以编译c++。如上面的HelloWorld程序我们也可以用以下的命令进行编译:
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">[luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> <span class="hljs-constant" style="box-sizing: border-box;">Cplusplus</span>]<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>gcc -lstdc++ <span class="hljs-constant" style="box-sizing: border-box;">HelloWorld</span>.cpp [luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> <span class="hljs-constant" style="box-sizing: border-box;">Cplusplus</span>]<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>ls a.out <span class="hljs-constant" style="box-sizing: border-box;">HelloWorld</span>.cpp test1 test2 [luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> <span class="hljs-constant" style="box-sizing: border-box;">Cplusplus</span>]<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>./a.out <span class="hljs-constant" style="box-sizing: border-box;">Hello</span> <span class="hljs-constant" style="box-sizing: border-box;">Wolrd</span>! [luowf<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@luoweifu</span> <span class="hljs-constant" style="box-sizing: border-box;">Cplusplus</span>]<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>
- gcc不会定义__cplusplus宏,而g++会
这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。
程序的编译及常用命令
将源代码编译成目标文件,不进行链接
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">gcc -c HelloWorld<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.cpp</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
在编译的时候,依据操作系统给予优化执行速度
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">gcc <span class="hljs-attribute" style="box-sizing: border-box;">-O</span> HelloWorld<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>cpp <span class="hljs-attribute" style="box-sizing: border-box;">-c</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
将目标文件链接成二进行(可执行)文件
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">gcc <span class="hljs-attribute" style="box-sizing: border-box;">-o</span> HelloWorld HelloWorld<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>o <span class="hljs-attribute" style="box-sizing: border-box;">-lstdc</span><span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">++</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
HelloWorld是可执行文件名,HelloWorld.o是目标文件名;如果是.c后缀的C源文件不用加-lstdc++,如果是.cpp后缀的C++源文件,要加-lstdc++。
在进行二进制文件制作时,将链接的函数库与相关的路径填入
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">(<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.cpp</span>文件)gcc -lstdc++ HelloWorld<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.cpp</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
或
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">(<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>c文件)gcc HelloWorld<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">.</span>c <span class="hljs-attribute" style="box-sizing: border-box;">-lm</span> <span class="hljs-attribute" style="box-sizing: border-box;">-L</span> /usr/Lib <span class="hljs-attribute" style="box-sizing: border-box;">-I</span> /usr/include</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>
说明:
-lm 指的是libm.so或libm.a这个函数库文件;
-L 后面接的路径是刚才上面那个函数库的搜索目录;
-I 后面的是源码内的include文件(也就是包含的math.h头文件)所在的目录;
HelloWorld.cpp代码如下:
<code class="hljs cpp has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <iostream></span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#include <math.h></span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> main() <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span> { <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">6</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span> << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"Hello Wolrd!"</span> << <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::endl; <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">7</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">float</span> value = <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">sin</span> (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3.14</span> / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>); <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span> <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::<span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">cout</span> << <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"value:"</span> << value << <span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">std</span>::endl; <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>; <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span> }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>
将编译链接的结果输出成某个特定的文件名