hit2015spring晨凫追风\frac{hit2015spring}{晨凫追风}欢迎关注我的博客晨凫追风

这篇文章算是一个学习的笔记吧,在很多的程序构建过程中的一些东西

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命令中的参数-L
2 再找gcc的环境变量LIBRARY_PATH
3 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

动态库链接执行时的搜索路径顺序

1 编译目标代码时指定的动态库搜索路径
2 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4 默认的动态库搜索路径/lib
5 默认的动态库搜索路径/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 File
2 也可以是可执行文件
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文件的一些解读相关推荐

  1. makefile文件编写教程

    技术交流QQ群:1027579432,欢迎你的加入! 1.make介绍 gcc:编译器(gcc根据菜谱进行编译) make: linux自带的构建器(相当于一个菜谱) 构建的规则(菜谱)在makefi ...

  2. pyradiomics的yaml文件参数设置解读、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(16)主要介绍: pyradiomics的yaml文件参数设置解读 pyradiomics 官网对yaml文件有详细说明: The th ...

  3. [转]C++ 使用Makefile文件

    //*********list class.h********** class tdate { private: int month; int day; int year; public: tdate ...

  4. 解析Makefile文件的构建规则

    2019独角兽企业重金招聘Python工程师标准>>> Makefile 编辑一个工程中的源文件不计其数,其按类型.功能.模块分别放在若干个目录中,makefile定义了一系列的规则 ...

  5. 例解 autoconf 和 automake 生成 Makefile 文件

    http://www.ibm.com/developerworks/cn/linux/l-makefile/ 生成 Makefile 的来龙去脉 首先进入 project 目录,在该目录下运行一系列命 ...

  6. Makefile文件应用——huge项目

    提高复用性 在build目录下,保存公用部分make.rule (1)绝对路径 用ROOT变量保存项目根目录 (2)增加控制变量 EXE/LIB/ (3)头文件查找目录 gcc 的-I(i的大写)选项 ...

  7. Makefile文件的编写规则

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Makefile文件编写规则 文章目录: 1 makefile文件介绍 2 makefile文件编写 1 makefile文件介绍 makefile是 ...

  8. Makefile文件的使用

    先看下面的Makefile代码: # Makefile for boot # Programs, flags, etc. ASM        = nasm ASMFLAGS    = -I incl ...

  9. MakeFile 文件的作用

    makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等).创建程序(make程序)首先读取makefi ...

最新文章

  1. 【复盘】小朋友的奇思妙想
  2. maven的安装和环境配置的过程记录
  3. C++中指针和引用的区别
  4. 程序员入职国企,1周上班5小时,晒出薪资感叹:腾讯当CEO也不去
  5. SAP CRM OData multiple origin Composition的测试
  6. 构建之法第4.17章读书笔记
  7. [转载] python list中append()与extend()用法
  8. Centos7之卸载oracle11G
  9. 5G布控球星光级400万高清布控球智能布控球
  10. 解决Vue中使用echart组件刷新问题
  11. Redis的持久化方式
  12. 多种方法教你如何让手机免费上网
  13. linux 命令详解 大于号_Linux 命令出现号(大于号)如何退出[组图]
  14. JAVA实现音频采样率转换
  15. hdwiki 框架简介
  16. 计算机键盘鼠标价格,价格相差5倍 看普通鼠标和游戏鼠标有何不同
  17. 与机器人恋爱?人工智能已开始影响人类伦理观
  18. SELINUX+PASSWD实战
  19. 跨链技术——公证人机制
  20. teleport ultra整站下载工具

热门文章

  1. 带入gRPC:gRPC Streaming, Client and Server
  2. SpingBoot-Thymeleaf-bootstrapTable-分页之H5
  3. QA seven's blog
  4. Oracle闪回原理-Logminer解读redo(r11笔记第17天)
  5. 解决Ubuntu系统中文乱码显示问题,终端打开文件及查看目录
  6. 使用ETL控件还是存储过程
  7. HD_2553N皇后问题
  8. 《机器学习实战》chapter 07利用AdaBoosting元算法提高分类性能
  9. Pytho正则表达式-match
  10. [LeetCode] 1091. Shortest Path in Binary Matrix