zoukankan      html  css  js  c++  java
  • gcc初步窥探

           由于没有上过Linux编程这门课,所以Linux学得很水啊!!用来用去都是ls -al ; cd .. ;这些渣命令,尤其gcc都不知道什么东西来的,所以先学一下吧。

    一.程序的编译过程

    对于GUN编译器来说,程序的编译要经历预处理、编译、汇编、连接四个阶段,如下图所示:

    http://new.51cto.com/files/uploadimg/20060926/1714230.jpg

    在 预处理阶段,输入的是C语言的源文件,通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 #include和#define命令。该阶段会生成一个中间文件*.i,但实际工作中通常不用专门生成这种文件,因为基本上用不到;若非要生成这种文件 不可,可以利用下面的示例命令:

    gcc -E  test.c -o test.i

    在编译阶段,输入的是中间文件*.i,编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示:

    gcc -S test.i -o test.s 

    在汇编阶段,将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示:

    gcc -c test.s -o test.o 

    最后,在连接阶段将输入的机器代码文件*.s(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代码文件。这一步骤,可以利用下面的示例命令完成:

    gcc test.o -o test 

    二.gcc常用模式

    假设我们新建一个test.c,其内容为:

    #include <stdio.h>
    
    int main(){
        printf("Hello world!
    ");
        return 0;
    }

    我们直接编译链接生成模式:

    dzhwen@deng:~$ gcc test.c -o test
    dzhwen@deng:~$ ./test
    Hello world!

    生成机器码模式:

    dzhwen@deng:~$ gcc -c test.c 

    重复命名格式:

    dzhwen@deng:~$ gcc test.c -o mytest
    dzhwen@deng:~$ ./mytest
    Hello world!

    联合编译链接生成模式:

    $ gcc -o test  first.c second.c third.c

    该命令将同时编译三个源文件,即first.c、second.c和 third.c,然后将它们连接成一个可执行程序,名为test。

    三.常见选项

    许多情况下,头文件和源文件会单独存放在不同的目录中。例如,假设存放源文件的子目录名为./src,而包含文件则放在层次的其他目录下,如./inc。当我们在./src 目录下进行编译工作时,如何告诉GCC到哪里找头文件呢?方法如下所示:

    $ gcc test.c –I../inc -o test

    上面的命令告诉GCC包含文件存放在./inc 目录下,在当前目录的上一级。如果在编译时需要的包含文件存放在多个目录下,可以使用多个-I 来指定各个目录:

    $ gcc test.c –I../inc –I../../inc2 -o test

    另外,我们还可以在编译命令行中定义符号常量。为此,我们可以简单的在命令行中使用-D选项即可,如下例所示:

    $ gcc -d TEST_CONFIGURATION test.c -o test

    查看警告信息:

    $ gcc -Wall test.c -o test

    四.常用的gcc命令

    1. 无选项编译链接

    dzhwen@deng:~$ gcc test.c

    作用:将test.c预处理、汇编、编译并链接形成可执行文件。这里未指定输出文件,默认输出为a.out。

    2.选项 -o

    dzhwen@deng:~$ gcc test.c -o test

    作用:将test.c预处理、汇编、编译并链接形成可执行文件test。-o选项用来指定输出文件的文件名。

    3. 选项-O

    dzhwen@deng:~$ gcc -O1 test.c -o test

    作用:使用编译优化级别1编译程序。级别为1~3,级别越大优化效果越好,但编译时间越长。

    4.多个文件一起编译。

    dzhwen@deng:~$ gcc testfun.c test.c -o test

    作用:将testfun.c和test.c分别编译后链接成test可执行文件。

    g++的基本命令与gcc的基本命令基本相同,在这里并不赘述。

    关于makefile的学习,看这里吧。

  • 相关阅读:
    《将博客搬至CSDN》
    所谓找链表中点
    虚函数
    编辑距离
    数组移位
    DFA
    Single Number III
    XOR异或解惑
    First Bad Version
    while(!in.empty()) 和 while(in.size())
  • 原文地址:https://www.cnblogs.com/sysu-blackbear/p/3700131.html
Copyright © 2011-2022 走看看