makefile文件的一些解读
来源:互联网 发布:淘宝升钻有什么好处 编辑:程序博客网 时间:2024/05/19 13:18
这篇文章算是一个学习的笔记吧,在很多的程序构建过程中的一些东西
gcc编程的四个步骤
命令格式如下
Gcc [选项] 要编译的文件 [选项] [目标文件]
其中[目标文件]可以缺省,Gcc默认生成可执行的文件名为:要编译的文件.out
例子:
# vi hello.c #include <stdlib.h>#include <stdio.h>void main(void){printf("hello world!\r\n");}
编译的命令为
gcc hello.c -o hello.exe
输出的是可执行文件 hello.exe
预处理
Gcc –E hello.c –o hello.i
主要处理#include和#define
把#include包含进来的.h文件插入到#include所在的位置把源程序中使用到的#define定义,用实际定义的字符串代替
上面命令中输出的是.i文件,该文件是经过预处理的C源程序。这个文件是可以查看的文本文件
编译
首先检查代码规范,是否有语法错误把代码翻译成汇编语言
该阶段的命令如下,它也可以接受.c后缀的文件
gcc -S hello.i -o hello.s
输出的是.s后缀名的文件,可以查看的文本文件
汇编
这个阶段是把上面的汇编程序翻译成二进制的机器指令文件
这个阶段接受的是.c或者.i或者.s文件都是没有问题的
命令行如下,它可以接受.c或者.i或者.s
Gcc –c hello.s –o hello.o
生成的是二进制文件,需要反汇编器GDB帮助才能读懂
链接
这里涉及到两种函数库:
静态库:编译链接时,把库代码全部加入到可执行文件中去,生成的文件比较大,运行时不在需要库文件,后缀名一般为.lib(win).a(Linux)动态库:在编译链接时并没有把库文件代码,加入到可执行文件中,而是在程序执行时,由运行时的链接文件加载库,节省系统开销,后缀一般为.dll(win).so(linux)
这里生成库的方法为:
生成静态库的方法: ar cr libxxx.a file1.o file2.o 就是把file1.o和file2.o打包生成libxxx.a静态库 使用的时候 gcc test.c -L/path -lxxx -o test 动态库的话: gcc -fPIC -shared file1.c -o libxxx.so 也可以分成两部来写: gcc -fPIC file1.c -c //这一步生成file1.o gcc -shared file1.o -o libtest.so
在运行程序时,需要在环境变量中指定动态库的位置,这里举例在Linux中的配置
export LD_LIBRARY_PATH=path
这里需要说明一个情况:
库中有同名的动态库和静态库文件时,系统会优先选择链接动态库,如果想要指定用静态库,则在编译的时候加入编译选项 -static,就会找到静态库。
静态库链接时的搜索路径顺序
1 ld会去找GCC命令中的参数-L2 再找gcc的环境变量LIBRARY_PATH3 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
动态库链接执行时的搜索路径顺序
1 编译目标代码时指定的动态库搜索路径2 环境变量LD_LIBRARY_PATH指定的动态库搜索路径3 配置文件/etc/ld.so.conf中指定的动态库搜索路径4 默认的动态库搜索路径/lib5 默认的动态库搜索路径/usr/lib
于是这个阶段的命令如下
Gcc hello.o –o hello
生成可执行文件 hello
上面是用一个个命令行来对一个简单的程序进行生产的过程,然而很多的工程需要很多的代码,然后就有一个叫make的工具来管理这些文件。
Makefile文件的一些知识
make工具是根据Makefile文件来对编译过程建立一个描述数据库,这个数据库记录了所有各个文件之间的相互关系,以及它们的的关系描述,当其中一个文件修改时,他通过比较前后两个文件修改的时间来决定是不是需要重新编译。
1 所有的文件都没有被编译过,则对各个C源文件进行编译链接,生成可执行程序
2 每一个在上次执行make之后修改过的C源代码文件,在本次执行make时会被重新编译
3 头文件在上一次执行make之后被修改。则所有的包含这个头文件的C源文件在本次执行Make时会被重新编译
这些文件重新编译生成中间文件.o文件,这些.o文件重新连接,就能形成可执行文件
makefile简单规则:
target ...:prerequisites ....... command ... ....
target是一个目标文件,
1 可以是Object File2 也可以是可执行文件3 标签
prerequisites
是生成这个target所需要的文件或者目标
command 是
make需要执行的命令
target 这个目标文件依赖于prerequisites这些文件,生成的规则在command里面,如果prerequisites里面有至少一个文件的时间比target要新的话,那就会执行command命令
这个command命令是以一个Tab键作为开头
make的工作方式:
这里举个例子
edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o
输入make命令
“`
1 make会在当前目录下找到名字叫Mkaefile或者makefile的文件
2 如果找到了,它会找文件中的第一个目标文件,并把它(上面的edit)作为最终的目标文件
3 如果edit不存在或者后面所依赖的.o文件比它要新,就会执行后面所定义的命令来生成这个edit文件
4 如果edit所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到了,就根据规则生成.o文件
“`
就像是剥洋葱一样,一层套着一层,直到最后的c代码文件和H文件,最后编译吃第一个目标文件
make只是找文件之间的依赖关系,像clean这样的,没有被目标文件关联或者间接关联的,那么它后面的命令将不会被自动执行,但是可以用make指令显式的要求执行它 make clean
当然 clean是放在最后的,这是一个不成文的规定吧
当然还有很多的编译选项没有说明,会再接着学习记录
- makefile文件的一些解读
- 一些Makefile文件解读
- 简单的makefile文件解读
- 解读makefile和source文件
- 解读makefile和source文件
- 解读makefile和source文件
- 解读makefile和source文件
- Java Class文件的一些解读
- caffe的Makefile.config解读
- 【转帖】解读makefile和source文件
- makefile文件中的一些问题
- Makefile解读
- 解读Makefile
- Makefile解读
- makefile解读
- Makefile解读
- Makefile解读
- Makefile解读
- Linux总结笔记4-网卡配置及双网卡绑定
- UESTC 1646 穷且益坚, 不坠青云之志。 差分约束、Fellman-ford
- PAT 1015 Reversible Primes(进制转换+素数)
- 乱码问题,解决办法不一定是”统一所有编码”
- Java 中的接口有什么作用?
- makefile文件的一些解读
- IMWeb提升营Day4 | 训练题21:栈的压入、弹出序列
- 【备忘】大数据Hbase视频源码解析与开发实战教程下载
- cef MasterBuildQuickStart
- Linux总结笔记5-配置虚拟主机
- 如何创建自己的网站
- 设计模式:工厂方法模式
- android 动画参考
- 多线程之CountDownLatch