linux & windows 编译c/c++文件

结合:https://blog.csdn.net/pjy19960808/article/details/50951227  https://blog.csdn.net/ytx2014214081/article/details/78262196

例如:有hello.c hello.cpp hello.h文件在一个目录

一、linux指令

  一步式指令:

gcc hello.c -o hello -I ./

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

二、windows指令

一步式指令:

gcc  hello.cpp  -o hello

三、详细解析

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

 1. 预处理(Preprocess)

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


gcc -E hello.c -o hello.i

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

  2. 编译(compilation)

        编译的作用就是把预处理完的文件进行一系列语法分析及优化后生成相应的汇编文件。用vim打开可以看到汇编代码。

gcc -S hello.i -o hello.s

3. 汇编(Assembly)

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

gcc -c hello.s -o hello.o

        reverse.o打开之后是乱码,改成十六进制之后虽然能看清楚是什么数字,但毕竟是二进制,还要进行翻译才能形成汇编指令。可以用vim进行转换。在vim的命令行模式(进入后按Esc后按:进入命令行模式),输入:

vim -b filename //文件名,注意替换
//进入命令行后:
 :%!xxd //要再输入一个:,一共两个:!

 4. 链接(Linking)

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

gcc hello.o -o hello
./hello

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值