Linux下的GCC编译器

 安装GC:sudo apt-get inatall gcc

一、c文件的编译步骤

二、GCC指令

1. 创建本节的测试用例

        创建".c"后缀的文件,文件中一般使用固定c框架的固定模板,这个是通过配置vim实现的,但是在上节中,我并未提到配置vim的方法,这里直接去搜索其他博主的教程即可。

        创建之后的a.c文件内容如下,其中包含代码中所需要的所有包:

#include <stdio.h>                                      
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <mqueue.h>
#include <time.h>
#include <semaphore.h>

int main(int argc, char *argv[])
{
    printf("Hello World\n");
    return 0;
}

2. 分部编译与直接编译

(1)分部编译的命令

gcc -E 文件名.c -o 文件名.i对.c程序文件进行预处理得到.i预处理文件
gcc -S 文件名.i编译得到.s汇编文件
gcc -c 文件名.s通过汇编得到.o机器码文件
gcc 文件名.o通过链接得到.out可执行文件
./文件名.o运行

(2)直接编译的命令

gcc 文件名.c使用gcc对程序进行编译,得到可执行文件的文件名为 文件名.out
./文件名.o运行

(3)对测试用例的操作  

        通过对二、(1)中的文件执行一套编译流程,即分部编译,最终得到a.out可执行文件,编译过程如下:

lyr@ubuntu:~/Desktop/GCCStudy$ gcc -E a.c -o a.i
lyr@ubuntu:~/Desktop/GCCStudy$ gcc -S a.i
lyr@ubuntu:~/Desktop/GCCStudy$ ls
a.c  a.i  a.s
lyr@ubuntu:~/Desktop/GCCStudy$ gcc -c main.s
gcc: error: main.s: No such file or directory
gcc: fatal error: no input files
compilation terminated.
lyr@ubuntu:~/Desktop/GCCStudy$ gcc -c a.s
lyr@ubuntu:~/Desktop/GCCStudy$ ls
a.c  a.i  a.o  a.s
lyr@ubuntu:~/Desktop/GCCStudy$ gcc a.o
lyr@ubuntu:~/Desktop/GCCStudy$ ls
a.c  a.i  a.o  a.out  a.s
lyr@ubuntu:~/Desktop/GCCStudy$ ./a.out
Hello World

        上面的步骤是:先vim编辑好a.c文件的内容,先gcc -E预处理成“.i”结尾的c文件(当然这个c文件可以自己任意命名,带后缀是方便知道自己知道各个文件的性质);再通过“gcc -S”将c文件编译成“.s”结尾的汇编文件;通过“gcc -c”将该汇编文件翻译成机器语言(二进制文件);再将翻译后得到的“.o”文件链接成可执行文件“.out”,最后执行“./a.out”的命令运行该可执行文件,输出“Hello World”,至此大功告成!

        上述过程在实际运用中,可通过直接编译以简化操作,过程如下:

lyr@ubuntu:~/Desktop$ gcc main.c
lyr@ubuntu:~/Desktop$ gcc main.c -o main
lyr@ubuntu:~/Desktop$ ./main
Hello World

        这样,步骤就简化的很多了,也是大功告成!

        注:在“.c”文件编辑时,一定要注意换行符的使用“\n”,如果没有可以使用换行符,那么得到的结果如下图:

三、 多c文件组织编译

1. 编译实例

(1)  在二、(1)的基础上进行修改,新的文件内容如下:

  1 //省略头文件
 14 //main.c
 15 int main(int argc, char *argv[])
 16 {
 17     printf("Hello World\n");
 18     thanks();                                                               
 19     return 0;
 20 }

(2) 增加文件thanks.c

  1 #include <stdio.h> 
  2 //thanks.c文件                                                         
 15 void thanks(){
 16     printf("Thank you\n");
 17 }

(3) 将两个文件一起编译。

lyr@ubuntu:~/Desktop$ gcc main.c thanks.c -o main
main.c: In function ‘main’:
main.c:18:5: warning: implicit declaration of function ‘thanks’ [-Wimplicit-function-declaration]
   18 |     thanks();
      |     ^~~~~~
lyr@ubuntu:~/Desktop$ ./main
Hello World
Thank you

        上述结果中出现了“warning(警告)”的原因是:在main.c编译之前并没有看到thanks()的声明,所以这里会警告,没报错的原因是因为编译器会按照旧式C规则自动生成一个隐式声明。后来在链接阶段,连接器将main.o和thanks.o拼到一起,在符号表中真正找到了thanks的定义,左移链接成功,产生可执行文件main。

注:这里如果更新了main.c的内容,两个文件都需要重新编译。

2. ELF可执行文件        

        ELF(Executable Linkable Format,可执行可链接格式)。

        目标文件通常按照特定格式进行组织,在Linux下,是通过对main.c和thanks.c链接得到的文件main得到ELF可执行文件进行组织的,通过“./main”的命令就可以将其运行起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值