【Linux】具体介绍自动化构建工具make/makefile以及动态库的明白
目录一、链接阶段的动态库的明白
(一)、基本概念
(二)、动态链接方式访问动态库的过程
(三)、静态链接
(四)、动态库和静态库优缺点
(五)、使用静态链接生成可执行文件:-static选项
使用ldd指令检察文件所链接的库
二、Linux项目自动化构建工具-make/Makefile
(一)、快速认识使用
1、介绍:
2、使用
(二)、解释依赖关系和依赖方法
(三)、具体介绍
1、项目的自动化清理
2、make指令使用顺序说明:
3、更改源文件也可以继续执行make
4、认识文件的三个时间(ACM时间)(stat指令可检察)
5、touch拓展小知识:
6、makefile文件的新语法:伪目的
7、makefile中定义变量和其他小知识
一、链接阶段的动态库的明白
(一)、基本概念
1、动态库文件的后缀名为 .so ,链接动态库的操作就叫动态链接。
2、静态库文件的后缀名为 .a,链接静态库的操作就叫静态链接。
3、动静态库的本质就是文件。
(二)、动态链接方式访问动态库的过程
首先编译器把内存中的相应位置告诉可执行程序,然后可执行程序开始一步一步执行代码,如果执行到某些标准库内里的内容(如库函数),就会去动态库中找到相应函数源码,然跋文录源码的地点(这个过程叫做库调用),记录后又将函数源码地点返回到内存当前代码位置(这个过程叫做函数返回),然后继续运行代码。这个过程就是动态链接访问动态库的过程。
https://i-blog.csdnimg.cn/direct/2956efddf8704fa6a4d352e9d75d55fd.png
因为动态库是被多个使用者共享使用,一旦缺失(不如误删库大概一些配件的更改),所有程序都不可运行了。如下:
https://i-blog.csdnimg.cn/direct/0e8f2c154e0949e097349d5082300a74.png
Linux中很多指令都链接了C动态库,若该库丢失了,那么这些指令都不可以用了。
(三)、静态链接
静态链接:在链接的时候,将库中的方法拷贝到本身的可执行程序里,以后程序都不再使用第三方库。(将本身需要的代码拷贝到本身的可执行程序中)。
注意:因为要将库中代码拷贝到本身的程序内里,就会使得本身的程序会占用很大的空间,这就会比较浪费资源(占用磁盘,进入内存后开辟的空间,使用网络下载时的开销)。
(四)、动态库和静态库优缺点
动态库:
(1)、长处:比较节省资源,不会出现太多重复的代码(资源指上面提到的磁盘,内存,网络等资源)。
(2)、缺点:对库的依赖性比较强,一旦库丢失,所有使用这个库的程序都无法运行。
静态库:
(1)、长处:不依赖库,同范例平台中(如centOS不同版本)都可以直接运利用用。
(2)、缺点:可执行程序体积比较大,比较浪费资源(资源指上面提到的磁盘,内存,网络等资源)。
(五)、使用静态链接生成可执行文件:-static选项
gcc默认使用的是动态链接,想要使用静态链接需要加入选项 -static:
https://i-blog.csdnimg.cn/direct/45a122d43928424fabdc711b1ccab7de.png
https://i-blog.csdnimg.cn/direct/f35d915006c1425bb082d2ed5f55e41a.png
如图分别是两个链接所产生的可执行文件,同样的代码,还只是几句C语言代码
文件大小竟然相差6倍左右。
使用ldd指令检察文件所链接的库
https://i-blog.csdnimg.cn/direct/231e7a2496a54b2d830de4a6beb59ee7.png
如图,检察test.o会提示“不是一个动态文件”,检察test1.o就会显示所依赖的库
二、Linux项目自动化构建工具-make/Makefile
(一)、快速认识使用
1、介绍:
(1)、一个工程中的源文件不计数,其按范例、功能、模块分别放在多少个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作 (2)、makefile带来的利益就是——“自动化编译”,一旦写好,只需要一个make下令,整个工程完全自动编译,极大的提高了软件开辟的服从。 (3)、make是一个下令工具,是一个解释makefile中指令的下令工具,一般来说,大多数的IDE都有这个下令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。 (4)、make是一条下令,makefile是一个文件,两个搭配使用,完成项目自动化构建 2、使用
make是一条下令, makefile是一个文件,两者一个是依赖关系,一个是依赖方法。 首先需要在源文件 (.c/.cpp)的目录下,新建一个名为 makefile 或 Makefile 的文件 https://i-blog.csdnimg.cn/direct/e2924c4f8b4f4160b9f12a12524c6663.png 然后打开该文件,写入两条代码: 第一条:是依赖关系,类似给目的文件起一个名字(你是谁,我为什么要帮你) 第二条:是依赖方法,即告诉他需要进行一个什么操作(怎么帮) https://i-blog.csdnimg.cn/direct/d402c1a0f6e64322b67cdc1aa131e5b5.png 如上,将第一条代码将 mybin这个名字与源文件相依赖,第二条代码进行 gcc -o的操作 设置好后在下令利用用 make 指令,这样就可以进行 gcc -o 操作生成可执行文件,生成的可执行文件名就叫 mybin。 https://i-blog.csdnimg.cn/direct/e682261e4951467a930b792935897102.png 该文件就是可执行文件,可以直接运行。 若将运行的操作也设置在文件内里: https://i-blog.csdnimg.cn/direct/6de4996654d64511a8a6fd0e12e19ae7.png make下令就会生成可执行文件后,并运行该文件: https://i-blog.csdnimg.cn/direct/0e7d864694d14f20bc5560b2c702efae.png (二)、解释依赖关系和依赖方法
依赖关系中有两个概念: (1)、目的文件 (2)、依赖文件列表,注意,这里是一个一列表,已空格作为分隔符。 https://i-blog.csdnimg.cn/direct/e9d7856a7f024451b22fe6853985dff7.png 依赖方法有个语法: 需要以tab键开头(不是空格) https://i-blog.csdnimg.cn/direct/92373f475a7146d19b751dd239b64fd8.png (三)、具体介绍
1、项目的自动化清理
我们发现一个征象: https://i-blog.csdnimg.cn/direct/675987c4ffa647449ca388c358dfd086.png 当 makefile文件设置好后,第一次执行 make文件会生成 mybin文件,但第二次再使用 make指令就会报错“ mybin已存在”,因为不大概生成两个同名文件。这时就可以使用自动化清理操作,在 makefile文件中设置自动化清理下令,如下: https://i-blog.csdnimg.cn/direct/0cfdcb674eee430b9f725dc4dbd73f78.png 再加一个依赖关系: clean,只是该目的文件可以没有依赖文件列表,然后在依赖方法中设置删除目的文件的下令, -f 选项表现强制的意思,这样不管文件存不存在,都会执行删除操作,避免过度询问。 设置好后,使用方法如下: https://i-blog.csdnimg.cn/direct/16b37511e9d94269a60777fb308172a9.png make反面接上目的文件名,即可执行删除操作,这样就不用手动删除 mybin文件了,可以直接通过 make下令进行删除。 问题来了,为什么第一个依赖关系使用 make指令时,反面不需要加目的文件?解释如下: 2、make指令使用顺序说明:
为了解释上面问题,我们可以观察一个征象: https://i-blog.csdnimg.cn/direct/239a614ee0734f88841ccb3b129f45ad.png 我们会发现两个征象: (1)、 make和 makefile形成目的文件的时候,默认是从上到下进行扫描 makefile文件的,并且默认形成的是第一个目的文件。 (2)、默认只能形成一个。 https://i-blog.csdnimg.cn/direct/f929560c111f496a97247b99f53de184.png 3、更改源文件也可以继续执行make
上述是为了办理多次使用 make指令的问题,除了使用项目自动化清理( clean),也可以使用以下方法:更改源文件后也可以继续使用 make指令,如下更改 test.c文件后可以继续使用 make指令: https://i-blog.csdnimg.cn/direct/1ffb0d9894a34bbd83f403fc621fd90a.png 所以我们可以知道: 问题: make和 makefile怎么知道可执行程序是比较新的呐(修改过)? 这个是通过对比文件的三个时间(ACM时间)比出来的,只要可执行程序的近来修改时间比所有源文件的近来修改时间新,说明他就是最新的(没有被修改过),反之则被修改过。 举例:例如vs编译器中的“重新生成办理方案”。 4、认识文件的三个时间(ACM时间)(stat指令可检察)
有了上面问题,如今我们来分析文件的三个时间,也叫 ACM时间: 访问时间、修改时间、改变时间 通过 stat 指令可以检察这三个时间: https://i-blog.csdnimg.cn/direct/0265361524d74e84a203e94d99804890.png (1)、修改时间: Modify 修改时间是受文件内容的影响而变革,如上述的改变 test.c的内容,那么修改时间就会相应变革,所以修改时间的改变是可以继续使用 make指令的。 (2)、改变时间: Change 我们会发现,有时当修改时间变革时,改变时间也会跟着变革,缘故原由是改变时间是受文件的属性的影响,而属性的变革有时会受文件内容的影响,例如当修改文件内容时,文件的大小会发生变革,也就是文件属性发生变革。所以说改变时间的改变,也是可以继续使用 make指令的。 (3)、访问时间: Access access时间不会轻易更新,只有具体深入访问或修改了文件后才会更新,因为访问文件内容的次数是对文件操作中占比最大的,若访问一次文件就更改一次访问时间,操作体系就会频繁访问磁盘文件,对 access时间进行修改,这就加大了体系的负担。 https://i-blog.csdnimg.cn/direct/0ec49acd25f34d2eab99b74059fa6716.png https://i-blog.csdnimg.cn/direct/24d31c70b9c8463ba98dbdba0b881697.png 最后得出结论,make指令重要是受修改时间的影响!!!。 5、touch拓展小知识:
使用 touch指令后,若文件不存在,则创建文件;若文件存在,则刷新文件的 acm时间。 6、makefile文件的新语法:伪目的
上面我们知道, makefile总是默认执行第一个依赖关系,并且只执行一个,那么每次都需要手动 make clean一下黑白常麻烦的,所以接下来就介绍新语法办理该问题: https://i-blog.csdnimg.cn/direct/36f1076850c946dfb81cc6f854f3de45.png 由上图我们学到两个知识: (1)、 makefile中的注释是 “ #+描述内容 ”; (2)、使用 .PHONY:目的文件名,修饰目的文件 mybin,这样 mybin就成为一个为伪目的,总是可以被执行,这样就不用思量上述的 ACM时间问题,可以一直使用 make,但是通常是将删除操作 clean 设置成伪目的,因为删除操作是必须一直可以执行的。 https://i-blog.csdnimg.cn/direct/00c5c5b8f83f4732b23619185d951117.png 7、makefile中定义变量和其他小知识
(1)、在 makefile中:“ $ ”代表目的文件,“ ^ ”代表源文件: https://i-blog.csdnimg.cn/direct/a8f99246316a4fc79f7289eef6445e29.png (2)、定义变量和使用变量的规则: https://i-blog.csdnimg.cn/direct/c8307e154a3647f09304b43989c813db.png 8、关于make/makefile的语法推到的明白:类似于栈 https://i-blog.csdnimg.cn/direct/2082b99d820243b08919f14ae08caf23.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]