当前位置:C++技术网 > 资讯 > Linux编程:4 GCC编译简单快速入门:编译代码

Linux编程:4 GCC编译简单快速入门:编译代码

更新时间:2017-01-11 11:24:35浏览次数:1+次

    在Windows中,我们利用Visual Studio强大的集成环境,只要点击一个编译按钮,就可以轻松编译。然而,在得到便利的同时,我们失去了对编译本身细节的了解。不过在Linux编程时,需要我们对此有一定的了解,否则连程序都编译不出来。
    虽然GCC开起来很强大,实际上在使用的时候,也可以很方便的。我们来看看GCC如何快速方便的编译程序。

    我们的代码如下:
//cjjjs.c
#include <stdio.h>

void main()
{
    printf("hello www.cjjjs.com\n");
}

1.直接默认设置编译
gcc cjjjs.c
    编译的结果:a.out
    a.out是默认的编译链接生成的可执行程序文件。可能你感觉这个名字比较怪异,而且是默认的a.out,所以你想指定一下生成的程序文件名。

2.指定生成可执行程序的文件名,使用gcc的-o命令选项
gcc cjjjs.c -o www.cjjjs.com
    编译的结果:www.cjjjs.com
    www.cjjjs.com就是可执行程序的名称哦。o是英文单词output的缩写,也就是输出的意思。后面紧跟着要生成的可执行程序的文件名。文件名可以有后缀,可以无后缀,也可以像这里的一个网址。因为Linux识别可执行文件是根据文件的属性,而不是根据文件后缀名。如果文件的属性为可执行,那么它就是可执行程序。

    gcc执行就完成了编译和链接以及创建可执行文件的工作。我们有时候可能只是想编译单个文件,并不需要马上生成可执行文件,我们就只需要仅仅编译而已。给gcc执行命令-c即可。

3.仅仅编译源代码文件
gcc cjjjs.c -c
    编译的结果:cjjjs.o
    cjjjs.o的o是编译后的二进制文件,在VC编译器中后缀名是obj,英文单词全称是object(对象)的意思。.o和.obj文件是中间对象文件,是链接时需要的文件。所以.o文件是在生成可执行文件时临时生成的,不是我们最终需要的。一般情况,我们并不需要.o文件。只有在我们仅仅需要单独编译一个文件,可以加-c选项编译一下。然后再链接。目的是为了加快编译的速度。不然每次一个小改动都整个工程编译,会很慢。

    以上就是简单的编译方法,对应VS里的编译按钮。当然,GCC非常强大,命令选项非常多,以上只是作为一个简单的入门,让你了解到GCC快速使用的方法。我们用的最多的应该是-o选项了吧。
    如果代码中有大量的循环或者可以优化的代码,我们可以启用代码优化功能。VS也是有这个选项的,在项目属性中设置。而GCC优化代码,使用-O和-O2命令选项即可。O是英文单词optimize(优化)的缩写。O2是O的加强版,优化的更加深入。优化的代价就是,会使编译的速度下降,O2的编译速度比O的速度还要慢。不过优化编译之后的程序执行速度就比普通编译得到的程序要快很多了。O2编译生成的程序运行速度>O编译生成的程序运行速度>直接编译生成的程序运行速度。

4.优化编译,提高程序运行速度
gcc cjjjs.c -o cjjjs -O
gcc cjjjs.c -o cjjjs -O2
    上面两个的编译结果都是:cjjjs
    需要注意的是,并不是说加了-O或-O2就一定优化编译了。代码中需要有可优化的地方,比如大量的循环,大量的变量复用,多余的代码,局部变量等等。而我们这个测试代码就打印了一句话,没有什么好优化的。

    我们知道,代码写完之后,很少能够一点错都没有。所以我们需要调试代码。前面编译的代码,是没有任何调试信息的。相对于VC,就是Release版本的可执行程序。为了能够调试代码,我们要生成调试版本的程序。相对于VC就是Debug版本的可执行程序。调试版本的程序会在可执行文件中加入很多运行相关的调试信息,方便我们排查问题。这也告诉我们,调试版的程序不要直接给别人用,因为带有很多调试信息,运行速度慢,文件大。

5.调试编译,在可执行文件中加入调试信息
gcc cjjjs.c -o cjjjs -g
    编译结果:cjjjs
    -g的g是gdb的缩写,也就是说,用-g选项添加的是gdb调试器需要的调试信息。调试程序也就是用GDB来调试。

6.头文件包含问题
    在文章《Linux编程中gcc包含头文件的一些总结》中对头文件包含做了详细的介绍。
    也就是,如果需要在编译时主动指定搜索头文件的目录,就可以使用-I命令选项。在后面紧跟着要搜索的目录名。在-I和目录路径之间可以有空格,也可以没有空格,如-I/usr/home/cjjjs/ 或 -I /usr/home/cjjjs/  。