techiall / Blog

🍋 [My Blog] See discussions
https://github.com/techiall/Blog/discussions
MIT License
8 stars 1 forks source link

Makefile #30

Open techiall opened 6 years ago

techiall commented 6 years ago

基础知识

编译和链接

1

把过程了解了,为什么要执行这条命令也就轻松多了。

绘图参考链接 http://www.ruanyifeng.com/blog/2014/11/compiler.html

静态库和动态库

静态库 动态库
特点 编译的时候将所有数据整合进目标代码中 编译时没有被编译进目标代码,执行到相关函数才调用
后缀 *.a *.so
命名规范 lib*.a lib*.so.major.minor
共同点 得存在 *.o 得存在 *.o
编译 ar crv out.a src_1.o src_2.o ... gcc -shared -fPIC -o libout.so src.o
链接 gcc main.c out.a -o out gcc -o out main.c libout.so
注意事项 / 将 *.so 放在 /usr/lib 或者 设置 export LD_LIBRARY_PATH="./"

Makefile 介绍

跟我一起写Makefile 感觉一篇文章就够了。

Makefile 注释方法

Makefile 的规则

写 Makefile 文件之前,首先得先明白编译和链接过程,知道要生成什么中间文件,过程懂了,再配合 Makefile 的书写规则,就没有什么太多问题。

在讲述这个makefile之前,还是让我们先来粗略地看一看makefile的规则。

target ... : prerequisites ...
   command
   ...
   ...
  • target

    可以是一个object file(目标文件),也可以是一个执行文件,还可以是一个标签(label)。对 于标签这种特性,在后续的“伪目标”章节中会有叙述。

  • prerequisites

    生成该target所依赖的文件和/或target

  • command

    该target要执行的命令(任意的shell命令)

这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件, 其生成规则定义在command中。说白一点就是说:

prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

这就是makefile的规则,也就是makefile中最核心的内容。

原文链接 https://seisman.github.io/how-to-write-makefile/introduction.html#id1