zoukankan      html  css  js  c++  java
  • C语言gcc处理过程

    gcc编译C文件一共四步,预处理(Preprocess),编译(Compilation),汇编(Assembly)和链接(Linking)

     1. 预处理(Preprocess)

                预处理是预处理中会展开以#起始的行,包括#if、#ifdef、#if ndef、 #else 、 #elif 、 # endif、#define、#include、#line、 #error、#pragma以及单独的#。其实就是把除了函数(包括main)以外的东西都展开成指定的形式,比如加上行号等,并将头文件里包含的东西所对应的文件(包括子文件夹)也都写入进去以便调用。同时也会把写在文件里的注释都删掉。

    gcc -E text.c -o text.i

        -E是仅激活预处理程序,将生成的信息放入text.i。如果不写 -o text.i 就会生成到终端显示。相当于重定向。 

    2. 编译(compilation)

            编译的作用就是把预处理完的文件进行一系列语法分析及优化后生成相应的汇编文件。

    gcc -S text.c -o text.s
    

     3. 汇编(Assembly)

            汇编就是把生成的汇编指令逐条翻译成机器可以识别的形式,即机器码(二进制文件),这一步会产生平台相关性,即决定了在哪种平台下运行。

    gcc -c text.s -o text.o
    

    .o文件是目标文件类型,如果执行会提示权限不够,使用 chmod o+x text.o 赋予权限,但会提示不可执行的二进制文件于是需要链接。

    4. 链接(Linking)

            这是最后一步,将生成的目标文件和其所依赖的库文件进行连接,生成一个可执行文件。链接的细节方面可以参考CSAPP的第七章,很详细,包括可执行目标文件和重定位目标文件的区别等。

    gcc text.o -o text.out

    5.运行程序

      输入    ./text.out  执行c程序

    一步gcc编译C文件:

    gcc text.c -o text -I ./ 
    ./text

    或者这样 

    gcc text.c -o text.o
    ./text.o
    

      

     如上 -o选项就是链接,后面加上生成的可执行文件的名字,不输入默认为 a.out 。所有步骤都隐式被悄悄搞定了,生成的文件用完都删掉了。-I 选项后面加上text.h 的路径,即告诉编译器在这个目录下找头文件,因为在 text.c 中用到了 text.h 。如果它们在同一个目录下是可以省略的。

  • 相关阅读:
    pytest
    pytest 跳过测试用例 skip
    pytest
    pytest -allure标记用例级别severity
    pytest-
    pytest-分布式执行(pytest-xdist)
    4、win10搭建easy-mock平台
    pandas日期缺失,空值填充方法
    Pandas拼接操作(concat,merge,join和append)的区别
    关于docker容器和镜像的区别
  • 原文地址:https://www.cnblogs.com/huxiaobai/p/10251084.html
Copyright © 2011-2022 走看看