来自于面试的问答:Makefile

Makefile

1. 准备知识
在开始学习make之前,首先需要明确一些基本概念:
**1) 编译:**把高级语言书写的代码转换为机器可识别的机器指令(重点)。编译高级语言后生成的指令虽然可被机器识别,但是还不能被执行,编译时,编译器检查高级语言的语法、函数与变量的声明是否正确,只有所有的语法正确,相关变量定义正确编译器就可以编出中间目标文件。通常,一个高级语言的源文件都可对应一个目标我呢见。目标文件在Linux中默认后为“.o” (如“foo.c”的目标文件为“foo.o”)。
(注:为了和规则的目标文件相区别。后续的文中将编译高级语言后生成的目标文件成为.0 文件)
**2)链接:**将多.o文件,或者.o文件和库文件链接成为可被操作系统执行的可执行程序(Linux环境下,可执行文件的格式为"ELF"格式)。链接器不检查函数所在的源文件,只检查所有.o文件中的定义的符号。将.o文件中使用的函数和其它.o或者库文件中的相关符号进行合并,对所有文件中的符号进行重新安排(重定位),并链接系统相关文件(程序启动文件等)最终生成可执行程序,链接过程使用GNU的“ld”工具。
**3)静态库:**又称为文档文件(Archive File)。它是多个.o文件的集合。Linux中静态库文件的后缀为“.a”.静态库中的各个成员(.o文件)没有特殊的存在格式,仅仅是一个.o文件的集合。使用“ar”工具维护和管理静态库。
**4)共享库:**也是多个.o文件的集合,但是这些.o文件时有编译器按照一种特殊的方式生成(Linux中,共享库文件格式通常为“ELF”格式,共享库已经具备了可执行条件)。模块中各个成员的地址(变量引用和函数调用)都是相对地址。使用此共享库的程序在运行时,共享库被动态加载到内存并和主程序在内存中进行链接。多个可执行程序可共享库文件的代码段(多个程序可以共享的使用库中的某一个模块,共享代码,不共享数据)。另外共享库的成员对象可被执行(由libdl.so提供支持)。
如果想要了解更加详细的ld用法,请参考info ld中关于ld的说明和用法。
这些都是基础中的基础,如果想要作为一名合格的linux嵌入式工程师,就需要知道这些基础的不能在基础的知识了。

发布了53 篇原创文章 · 获赞 16 · 访问量 2213

猜你喜欢

转载自blog.csdn.net/m0_37757533/article/details/105169644
今日推荐