Linux - gcc/g++的编译方式

目录

前言

一、使用编译工具

二、程序翻译的过程

1.预处理

2.编译

3.汇编

查看可执行文件的汇编代码

查看文件类型信息

4.链接指令

查看可执行文件所依赖的库

三、库与库链接的区别

动态库:

静态库:

总结


前言

本质主要是探讨C/C++语言编译的过程,以及东静态库的了解


一、使用编译工具

我们当写一个 .c 文件时,当想将 .c 文件进行编译时就需要用指令 gcc 去进行编译,默认名字也可执行文件。
指令:gcc 指定名文件  加上  -o (名字) 

想执行 test 文件时,路径带 ./加上可执行文件名即可

用 g++ 指令也可以进行编译与 gcc 指令一样。
但 gcc 只能编译 .c 文件,编译不了 cpp 文件,g++ 指令可以编译 .c 和 .cpp文件,也就是说 cpp 文件只能用 g++ 指令进行编译。
测试:

报错:

二、程序翻译的过程

我们的程序为什么要进行编译?
主要原因是机器只处理二进制文件,人类由于对二进制处理不方便,所以就发明了汇编语言、高级语言去编写,然后将以上语言进行编译处理为二进制交给计算机去处理。

1.预处理

预处理有哪些作用呢?1.将头文件展开 2.去注释 3.宏替换 4.条件编译 等 做了以上处理还是C文件。
当我们在编译的过程中只想看预处理的文件时也是有指令的,在文件编译的过程中在预处理就停止,使用 -E 功能。
指令:gcc -E code.c o code.i
Linux中C语言的头文件路径在 /usr/include/stdio.h 
将stdio.h文件拷贝到引用文件test_c.c文件内部中,这步骤称为 头文件 展开。
所以头文件展开,本章是在预处理的时候,将头文件内容拷贝至源文件内。

可以发现上面都是stdio.h头文件的展开了。



这里也进行了去注释的处理。

2.编译

当预处理完成后,就要进行编程生成汇编文件了,我们为何要编译成汇编文件呢?主要是在以前的人已经将汇编语言可以生成二进制文件了,所以我们无需再将高级语言直接变为二进制文件,可以节省很多时间和难度。
使用 -S 进行程序翻译时,当编译完成就停止执行后面的操作。
指令:gcc -S code.i -o code.s
当想查看汇编代码时
指令:vim code.s

3.汇编

完成编译后我们就可以进行下一步,将汇编文件生成二进制文件了,使用指令 -c 。
-c 当汇编工作完成后就停止。
指令:gcc -c code.s -o code.o
code.o 文件是不可执行的,但我们也可以看到生成出的文件

查看可执行文件的汇编代码

指令:objdump -s 可执行文件

查看文件类型信息

指令:file 可执行文件

4.链接指令

链接指令无需使用功能,只需要正常gcc编译就会自动去链接文件
指令:gcc code.o -o code (自动与c库进行链接)

查看可执行文件所依赖的库

指令:ldd 可执行文件

三、库与库链接的区别

在系统中平台需要支持开发的话,就必须要提前在系统中安装语言的标准 头文件 + 库文件!

库分为动态库与静态库:


在不同的系统库的后缀名都不相同的。使用不同的库时,其实就是进行库的链接,库是被多个使用者共享使用的,当库一旦消失了,所有程序都不可运行的,因为程序依赖库文件。

动态库:

使用动态库时其实就是动态链接。
优点:比较节省资源,因为库的方法和函数都是由地址链接的,就不会出现大量重复的代码。
缺点:对库的依赖性比较强,一旦库丢失,所有使用这个库的程序都无法运行,对比静态库效率会稍微底下些。

静态库:

静态库相对应就是静态链接了。
优点:静态链接本质是将方法拷贝到可执行程序当中,所以会不依赖库,同类型平台中都可以直接运行使用,
缺点:可执行程序体积比较大,会导致浪费资源。

资源指的是磁盘、内存、网络等资源

动态链接方法直接gcc进行编译就会是默认动态链接

静态链接方法是在基础gcc编译时后面加上 -static 就会静态链接
指令:gcc -o test test.c -static


总结

本章主要是讲解c/c++语言在编译中所发生的过程,在Linux中可通过相应的功能去查看,Linux下一章会带大家一起做一个进度条的,期待大家到来。

相关推荐

  1. GCC 安装编译linux

    2024-03-20 22:32:02       39 阅读
  2. LinuxGCC编译器(七)

    2024-03-20 22:32:02       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-20 22:32:02       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-20 22:32:02       20 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-20 22:32:02       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-20 22:32:02       20 阅读

热门阅读

  1. 配置虚拟机

    2024-03-20 22:32:02       18 阅读
  2. 图像分割在医学影像中的应用

    2024-03-20 22:32:02       20 阅读
  3. C#开发五子棋游戏:从新手到高手的编程之旅

    2024-03-20 22:32:02       18 阅读
  4. Websorket 和Websorket的底层协议

    2024-03-20 22:32:02       22 阅读
  5. 人工智能的迷惑瞬间:虚幻与现实的交汇

    2024-03-20 22:32:02       17 阅读
  6. 高亮搜索中的关键字怎么实现

    2024-03-20 22:32:02       18 阅读
  7. Django资源路径问题

    2024-03-20 22:32:02       19 阅读
  8. AI助力化工企业迈向智能化发展

    2024-03-20 22:32:02       16 阅读
  9. 104. 二叉树的最大深度

    2024-03-20 22:32:02       19 阅读