Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用

目录

程序的编译

1.预处理(头文件展开,条件编译,宏替换,去注释等)

2.编译(C语言汇编语言)

3.汇编(汇编——>可重定位目标二进制文件,不可被执行的,bin.obj)

4.链接(将我们这自己形成的.obj文件和库文件进行某种合并,形成可执行程序)

 静态库动态库

为什么我们能在LInux下进行c,c++代码的编写与编译呢?

动静态库的区别以及优缺点:

静态库和静态连接:

动态库和动态连接:

静态库因为自身拷贝的问题,比较浪费空间;而动态库相对而言,程序内部只有地址,比较节省空间

Linux项目自动化构建工具-make/Makefile

背景:

 用法及其相关知识:

 用make形成可执行程序

语法:

用make clean清理项目

语法:

补充 :


程序的编译

首先我们要知道,gcc/g++是一个编译器,那这个编译的过程是怎么样的呢?

以c语言为例

先来学习一个指令:gcc -o

在我们单用gcc 来编辑c语言文件时,会生成一个a.out的可执行程序

但是如果我们不想让他是这个名字,就可以用gcc -o 来自己取名


由此可以看出语法无非就是 gcc -o filename file.c

gcc file.c -o filename也可以(更推荐这个)

1.预处理(头文件展开,条件编译,宏替换,去注释等)

-E从现在开始进行程序的编译,预处理做完,就停下来

先预先准备一个c语言的文件

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第1张图片

这样直接处理会直接显示在命令工作台上,很多行不好观察

编译文件出来后用vim打开

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第2张图片

找到最后的代码部分比对之前的代码

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第3张图片

上面的800多行是头文件展开

条件编译,宏替换,去注释等都已经完成了

2.编译(C语言汇编语言)

-S从现在开始进行程序的编译,当编译做完,就停下来

生成对应的汇编语言

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第4张图片

3.汇编(汇编——>可重定位目标二进制文件,不可被执行的,bin.obj)

-c从现在开始进行程序的翻译,当汇编做完,就停下来

   ---只把我们自己的代码进行翻译形成二进制文件

二进制文件

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第5张图片

4.链接(将我们这自己形成的.obj文件和库文件进行某种合并,形成可执行程序)

 

生成可执行程序

运行一下试试

记忆技巧

E 预处理  形成文件 filename.i

S 翻译  形成文件 filename.s(汇编语言)

c 链接  形成文件 filename.o(二进制)

三个合起来就是Esc也就是就是我们键盘左上角的按键Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第6张图片当然在这里记得第二个S大写

形成的临时文件 iso 

--------------------------------------------------------------------------------------------------------

 静态库动态库

下面我们来讨论一下链接:

为什么我们能在LInux下进行c,c++代码的编写与编译呢?

    原因是 LInux系统默认已经携带了语言级别的头文件和语言对应的

一般可以库文件保存在/usr/include 路径下 

 下面是我的机器里自带的一些库

 Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第7张图片

 在这里有没有看到老熟人,stdio.h呢

而这里的库,分为两种 分别是静态库,动态库  ---其本质也是文件

静态库的结尾是.a 

动摇库的结尾是.so

要想知道库的名字去掉前缀,去掉后缀就是库的名字

动静态库的区别以及优缺点:

---------------------

静态库和静态连接:

链接的时候如果是静态连接,找到静态库,拷贝静态库中我所需要的代码到自己的可执行程序中

静态链接成功:我们的程序,不依赖任何库,自己就可以独立运行

----------------------

动态库和动态连接:

链接的时候如果是动态连接,找到动态库,拷贝动态库我所需要的代码的地址到我自己的可执行程序中相关的位置 

动态链接成功:我们的程序,还是依赖动态库,一旦动态库缺失,程序就无法运行

------------------------

静态库因为自身拷贝的问题,比较浪费空间;而动态库相对而言,程序内部只有地址,比较节省空间

这里举个栗子

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第8张图片

我们分别通过动态库链接和静态库链接来形成一个输出hello world的程序

 

 这里的example的大小为8360字节,而通过静态库的staticexample的大小有足足861296字节,同样的程序,空间的浪费显而易见

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第9张图片

file指令查看信息

静态链接: 

动态链接:

--------------------------------------------------------------------------------------- 

Linux项目自动化构建工具-make/Makefile

背景:

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的
规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂
的功能操作
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编
译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命
令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一
种在工程方面的编译方法。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

 用法及其相关知识:

 用make形成可执行程序

 ​​​​​​​​​​​​​​​​​​​​​

这里的myfile的形成依赖于myfile.c

这里称为 依赖关系

而下面的黄色字体 称为为 依赖方法

语法:

目标文件:依赖文件列表(冒号左侧依赖于右侧)

           table键+依赖方法

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第10张图片

这里可以看出这里的实现,依赖关系相当于‘入栈’,依赖方法相当于‘出栈’

用make clean清理项目

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第11张图片

.PHONY 表示总是被执行

语法:

    clean:

      table键+清理方法

补充 :

这里当我们已经make一次文件后再第二次make却不行了,这种现象叫做 不是总是被执行的

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第12张图片

怎么解决呢,用.PHONY修饰myfile再来试试

这里修饰的目标叫做伪目标

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第13张图片

这里就可以多次make了

这里再次回到这个问题,make怎么知道这个myfile是最新的

 源代码的最近修改时间早于可执行程序---不让make   反之 可以make

如何在不改源代码的情况下修改这个时间呢?

stat指令查看文件的状态信息

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第14张图片

这里的myfile.c的修改时间是早于myfile的修改时间的

但是用touch可以更新文件的修改时间

(文件不存在创建新文件,存在则更新时间)

Linux工具之编译器gcc/g++的使用|动静态库|make/makefile的使用_第15张图片 

修改完成后第二次make又成功了 

 ----------------------------------------------------

你可能感兴趣的:(Linux笔记,linux,运维,服务器)