Ubuntu初探-GCC编译

由于部分功能的需要,在某活动送的移动硬盘上安装上Ubuntu玩玩,本想装Redhat工作站什么的耍耍,奈何功力太浅,又无心研究,先拿这一款操作系统练练手。对GCC是什么就不赘述了。


对于一个程序,可以一步到位地编译:

gcc test.c -o test

但仅仅局限在这样便捷的操作上,太对不起自己的求知欲了。

实质上,上述命令是简化了四个步骤:预编译(Preprocessing)、编译(Compilation)、汇编(Assembly)、连接(Linking)

这里给出一个小程序,并提供给四个步骤生成的代码。(这里插一句,vi是神一样的编辑器这种说法真的真的只是个人臆断,用的舒服不舒服完全是看自己的。切莫人云亦云。)

#include <stdio.h>

int main(){
    printf("Hello,Linux.\n");
    return 0;
}

仅是个简单的“Hello,World”

我们对其预处理,命令如下:

gcc -E test.c -o test.i
那么test.i里的内容是如下的:

# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test.c"
# 1 "/usr/include/stdio.h" 1 3 4
# 27 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
# 374 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 1 3 4
# 385 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/bits/wordsize.h" 1 3 4
# 386 "/usr/include/x86_64-linux-gnu/sys/cdefs.h" 2 3 4
# 375 "/usr/include/features.h" 2 3 4
# 398 "/usr/include/features.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 1 3 4
# 10 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 3 4
# 1 "/usr/include/x86_64-linux-gnu/gnu/stubs-64.h" 1 3 4
# 11 "/usr/include/x86_64-linux-gnu/gnu/stubs.h" 2 3 4
# 399 "/usr/include/features.h" 2 3 4
# 28 "/usr/include/stdio.h" 2 3 4

预处理的结果是将stdio.h文件中的内容插入到test.c中


标准的预处理规定,C/C++要求支持包括条件编译(#if #ifdef #ifndef #else #elif #endif)、宏定义(#define)、包含(#include)、行控制(#line)、错误指令(#error)、杂注(#pragma)、空(#)。预处理指令一般用来使源代码在不同的编译环境下方便的修改或编译。


而后,对预编译后的结果文件编译为汇编代码,命令格式如下:

gcc -S test.i -o test.s
那么test.s里边是编译后的汇编代码:

        .file   "test.c"
        .section        .rodata
.LC0:
        .string "Hello,Linux."
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $.LC0, %edi
        call    puts
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc

而后,将编译后的汇编代码编译成为目标文件:

gcc -c test.s -o test.o

目标文件就不太好看了,里边是编译后的机器码。

最后就是将各个目标文件链接起来生成可执行文件了,连接负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

gcc test.o -o test


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值