3.1 配套视频内容大纲 3.1.1 Makefile 规则与示例 参考文档:gunmake.htm ① 为什么需要 Makefile 怎么高效地编译程序? 想达到什么样的效果?...请参考 Visual Studio:修改源文件或头文件,只需要重新编译牵涉到的文件, 就可以重新生成 APP ② Makefile 其实挺简单 一个简单的 Makefile 文件包含一系列的“规则”...Makefile 的使用 我参考 Linux 内核的 Makefile 编写了一个通用的 Makefile,它可以用来编译应用程序: ① 支持多个目录、多层目录、多个文件; ② 支持给所有文件设置编译选项...3.1.3 通用 Makefile 的解析 ① 零星知识点 A. make 命令的使用: 执行 make 命令时,它会去当前目录下查找名为“Makefile”的文件,并根据它的指示去执行操作,生成第一个目标...所以,不能采用‘’和圆括号的格式书写该变量,当然,如果需要使用非常量的文件名,可以在文件名中使用变量引用。
3.1 配套视频内容大纲 3.1.1 Makefile 规则与示例 参考文档:gunmake.htm ① 为什么需要 Makefile 怎么高效地编译程序? 想达到什么样的效果?...请参考 Visual Studio:修改源文件或头文件,只需要重新编译牵涉到的文件, 就可以重新生成 APP ② Makefile 其实挺简单 一个简单的 Makefile 文件包含一系列的“规则”...Makefile 的使用 我参考 Linux 内核的 Makefile 编写了一个通用的 Makefile,它可以用来编译应用程序: ① 支持多个目录、多层目录、多个文件; ② 支持给所有文件设置编译选项...3.1.3 通用 Makefile 的解析 ① 零星知识点 A. make 命令的使用: 执行 make 命令时,它会去当前目录下查找名为“Makefile”的文件,并根据它的指示去执行操作,生成第一个目标...所以,不能采用‘ ’和圆括号的格式书写该变量,当然,如果需要使用非常量的文件名,可以在文件名中使用变量引用。
6.多源文件目录的简单模板 通过上面简单示例可以大致了解Makefile的基本编写方法与内容,实际上,Makefile可以通过make自动推导特性、内置变量、自动化变量和函数等编写地更加简洁优雅,并且可以模板化...下面看一个简单的Makefile模板 假设源文件均为.cpp文件,那么简洁的、通用的Makefile模板可以书写为如下格式: #指定多个源文件目录 DIR_SRC0 = ....(4)Makefile中对一些简单变量的引用,可以不使用”()”和”{}”来标记变量名,而直接使用$x的格式来实现,此种用法仅限于变量名为单字符的情况。另外自动化变量也使用这种格式。...伪Target是用来显示请求执行的命令名称。 为什么使用PHONY来指明命令名称: (1)避免和同名文件冲突。...原来这种是老式的“双后缀规则”,编译器会自动将Makefile所在目录的.cpp识别为源文件后缀,而.o识别为输出文件后缀。特别需要注意的是,后缀规则不允许任何依赖文件,但也不能没有命令。
中的编译器 gcc/g++ 了,我们一般使用 gcc 编译C语言,g++ 编译C++(当然 g++ 也可编译C语言),这两个编译器我们可以当作一个来学习,因为它们的命令选项都是通用的,只是编译对象不同...生成的文件后缀为 .o 因为计算机只能看懂二进制,所以将代码转为二进制是必须进行的操作,除此之外,还有一个重要步骤:生成符号表 关于符号表 这个东西相当于函数独一无二的地址,在Linux 中,C语言的符号表比较简单...文件 要想使用 make 指令,就得先有 Makefile 文件,Makefile 文件中主要编写任务,而任务由 依赖关系 + 依赖方法 构成 1.依赖关系 比如源文件为 test.c ,编译后生成的文件为...文件并执行相关任务,使用了 make file 指令,并没有直接使用 make指令,因为这个指令还是有些说法的 单纯输入 make 指令时,默认执行 Makefile 中的第一个任务,当任务成功执行后...,期待留下一个小小的赞,你的支持是我分享的最大动力!
这里,我介绍一个非常简单的指令->nano 这个指令就类似于我们Windows中的记事本,使用方法也很简单 1.2 nano指令的使用 1.2.1 介绍 nano指令的使用主要分为五步 创建.c文件 nano...动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。...使用c++11标准 gcc不能编译c++代码,但是g++可以编译c语言代码 g++也可以加-o选项,编译成指定的可执行程序 c++的文件后缀 c++的文件后缀有三种:.cc .cpp .cxx (...动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。...,即如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦 #include int main() { printf("hello Makefile!
下面对makefile的相关问题进行简单介绍: 1、Makefile的基本结构 Makefile的一般结构: target……:dependency…… command…… 结构中各部分的含义: (1...Tab而不能使用多个空格)。...后缀规则定义了将一个具有某个后缀的文件 (例如,.c 文件)转换为具有另外一种后缀的文件(例如,.o 文件)的方法。...这种规则更加通用,因为可以利用模式规则定义更加复杂的依赖性规则。...它会继续载入其它的文件,一旦完成makefile的读取,make会再重试这些没有找到,或是不能读取的文件,如果还是不行,make才会出现一条致命信息。
六、另类风格的makefile 即然我们的make可以自动推导命令,那么我看到那堆[.o]和[.h]的依赖就有点不爽,那么多的重复的[.h],能不能把其收拢起来,好吧,没有问题,这个对于make来说很容易...为什么需要使用这样的步骤?...下面是的取值: a —— 也就是all,输出所有的调试信息。(会非常的多) b —— 也就是basic,只输出简单的调试信息。即输出不需要重编译的目标。...隐含规则 ———— 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o]文件,Windows下是[.obj]...这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么”*”也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么”*”就是除了后缀的那一部分。
链接 我们已经通过上面的 汇编 步骤得到二进制文件了,为什么还不能执行呢?因为我们上面的到的不是真正的可执行文件,其缺少一些必要的系统入口代码和库实现文件。...那么假设我们有一个非常大的程序,其需要链接很多个 .o 文件,那么我们总不能每编译一次就写一次这么长的命令行吧。...不知道小伙伴有没有好奇,在上面我将 custom1.o 和 custom2.o 打包成一个库的时候为什么要将打包后的库文件命名为 libcustom.a。...动态库和静态库 在上面我们已经成功的创建并使用了我们自己的库(libcustom.a)。为什么我要将库文件命名为 libcustom.a 呢?这其实和库文件的种类和命名标准有关。...因为我的 PC 为 Windows 系统,因此这里将生成的动态链接库文件后缀名设置为 .dll,如果是 Linux 系统,那么文件后缀名改为 .so。
1.6 另类风格的makefile 即然我们的make可以自动推导命令,那么我看到那堆[.o]和[.h]的依赖就有点不爽,那么多的重复的[.h],能不能把其收拢起来,好吧,没有问题,这个对于make...值得一提的是,这种方法,前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。...endif endif 当然,你也许会说,使用override关键字不就可以重新定义环境中的变量了吗?为什么需要使用这样的步骤?...下面是的取值: a —— 也就是all,输出所有的调试信息。(会非常的多) b —— 也就是basic,只输出简单的调试信息。即输出不需要重编译的目标。...隐含规则 ———— 在我们使用Makefile时,有一些我们会经常使用,而且使用频率非常高的东西,比如,我们编译C/C++的源程序为中间目标文件(Unix下是[.o] 文件,Windows下是
在我写 Makefile 的头 10 年里,我养成了一个非常不好的习惯 -- 完全严格使用 GNU Make 的扩展名。...当项目不大的时候,Makefile 应该是相当的简单,并且随着项目的成长,以一种可预见,清晰的方式不断丰富。 我不会覆盖 make 的每一个特性。如果想要学习所有完整的内容,你需要自行阅读它的规范。...本指南将会详细讨论一些重要特性和约定俗成的规定。遵守已有的约定是非常重要的,这样使用你的 Makefile 的其他人,才能知道它能够完成和如何完成一些基本的任务。...在一个规则中,命令会随即跟在目标或先决条件那一行的后面。每个命令行必须以一个 tab 字符开头。如果你的编辑器不能进行相关配置的话,可能会非常麻烦。...del /f 并不能达到同样的效果。 所以,尽管它与 POSIX make 已经很接近,但是想要写一个 Makefile 能够同时被 POSIX make 和 Nmake 同时使用,是不太实际的。
对MSYS2我还是比较熟悉的,既然官方的建议也是在MSYS,那就在MSYS2下搞吧,MSYS2安装很简单,网上有教程,请自行百度。...安装依赖库 有了MSYS2安装依赖库就非常简单了,以下是通过pacman安装所有编译glib所需要的工具和依赖库。...lib) 问题来了,在MSYS2下编译用的是MinGW编译器,生成的导入库(import library)都后缀是.dll.a,MSVC怎么使用呢?...其实glib的Makefile是支持在编译时生成MSVC的 .lib .def文件的。...而默认情况下,MSYS2环境中搜索路径($PATH)中没有MSVC编译器的安装位置(bin).所以这一条命令不能执行,不能生成lib。
1 问题发现 编译主线 kernel 版本的时候发现, 的内核版本编译成功后生成的版本号变成了 "x.y.z+", 为什么后面会多一个加号呢?...都会出现 + 后真的感觉很郁闷, 强迫症的我真的受不了. 2 原因分析 问题必然出现在 linux 构建过程中的版本控制这一块, 既然是在构建的过程中添加的, 那我们就可以从 Makefile 中发现一些端倪...这些是我们内核版本的版本号, 生成出来的版本号理论上不应带 + 号, 但为什么带 + 号呢....内核中有两个配置宏 CONFIG_LOCALVERSION 和 CONFIG_LOCALVERSION_AUTO 配置了系统内核版本号和后缀的信息. 2.2 Makefile 中读取和设置版本号 我们检索与这两个宏相关的信息...如果代码属于 git 管理 打了 tag, 则会添加tag相关字符 如果 tag 只是简单的标记, 比如 4.14-rc8 则跳过, 因为这些信息已经从前面 makefile 中获取到了 没有打 tag
目录 1.g++/gcc的使用 2.Makefile ---- 1.g++/gcc的使用 在学习gcc/g++之前,需要先回顾一下程序的翻译过程: 预处理(头文件展开、去注释、宏替换、条件编译) 编译...因此,以下代码的含义: 预处理: gcc -E test.c -o test.i -o:指明形成的临时文件名称,.i(后缀,在linux中后缀没意义,是给人看的) ;-E:从现在开始,进行程序的翻译...,那么,去掉前缀和后缀,剩下的就是我们需要知道的库。...makefile是一个文件,make是一个命令。 如何使用makefile?注:可以大写,可以小写。...其实访问它,确实是会变,但是呢,如果在短时间内(非常短的时间),它不会变。即不会频繁去改变时间。其原因是,我们会频繁地访问文件,如果频繁地去修改时间,意味着要非常多次地去访问磁盘,是一个负担!
以下是一个简单的 Makefile 文件的示例,以及对其中关键部分的详细解释: 1....变量引用: 使用 @ 表示目标,^ 表示所有依赖文件, 通配符: 使用 % 通配符来表示一类文件,例如 %.o: %.c。 Makefile 是一个非常强大的工具,可以用于管理复杂的项目结构。...以上示例是一个简单的入门级别的 Makefile,实际项目中可能会包含更多的配置和规则。 5....通用规则 如果有多个类似的目标文件,可以使用通用规则。通用规则使用通配符 % 来匹配文件名的一部分。...make 使用一个名为 Makefile 的文件,其中包含了一系列规则和指令,描述了文件之间的依赖关系以及如何生成目标文件。以下是一个简单的 Makefile 文件的结构和基本要素: 11.
大家好,又见面了,我是你们的朋友全栈君。...或者可以使用 obj=$(dir:%.c=%.o) 效果也是一样的。 这里用到makefile里的替换引用规则,即用您指定的变量替换另一个变量。...它的标准格式是 $(var:a=b) 或 ${var:a=b} 它的含义是把变量var中的每一个值结尾用b替换掉a 今天在研究makefile时在网上看到一篇文章,介绍了使用函数...对于一个已经定义的变量,可以使用“替换引用”将其值中的后缀字符(串)使用指定的字符(字符串)替换。.../myfile 起初使用的是变量替换引用的方式,但是却始终不生成中间的.o文件,但是使用patsubst后,一切正常了,如果你知道为什么,请留言告诉我吧 发布者:全栈程序员栈长,转载请注明出处:https
很多人学习嵌入式开发首先遇到的问题肯定是我的代码写在哪里?如何让我写的代码编译进系统 ?...如果你是在培训班学习,老师肯定会告诉你先不要管他怎么编译进系统,你只需要在代码所在目录下的Makefile中添加上你的代码文件的名字(后缀.c改成.o)就行了。...看了好多网文,博客之后,你是否仍然一头雾水,这TM到底是怎么联系起来的,为什么会有这么多Makefile文件?...cmd.h #使用静态规则,定义通用编译方法 %.o: %.c gcc -c $< clean: rm -rf *.o $(TARGET) 编译50个源文件 TARGET := app SRC...-f $(ROOTPATH)/Makefile.build clean;\ done; rm -rf *.o *.d 次Makefile: 次Makefile数量非常多,一般在每个代码目录下都会有一个
大家好,又见面了,我是你们的朋友全栈君。...下面是的取值: a: 也就是all,输出所有的调试信息。(会非常的多) b: 也就是basic,只输出简单的调试信息。即输出不需要重编译的目标。...用“后缀规则”来定义隐含规则会有许多的限制。使用“模式规则”会更回得智能和清楚,但“后缀规则”可以用来保证我们Makefile的兼容性。...这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么*也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么*就是除了后缀的那一部分。...这个特性是GNUmake的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用*,除非是在隐含规则或是静态模式中。如果目标中的后缀是make所不能识别的,那么?
\n"); return 0; } 下面是一个简单的makefile # helloworld is a binary file helloworld: test.o echo "good"...在makefile中,使用$(CC)的方式来调用宏的值。make会在运行时,使用宏的值(gcc)来替代$(CC)。 shell的环境变量可以直接作为宏调用。...(可以使用$make -e helloworld来优先使用环境变量) 类似于C语言的宏,makefile中的宏可以方便的管理一些固定出现的文本,并方便替换操作。...后缀依赖 在makefile中使用 .SUFFIXES: .c .o 来说明.c和.o是后缀。...make会发现该依赖关系符合.c.o的后缀依赖,并执行该后缀依赖后面的操作。 如果项目很大型的时候,后缀依赖非常有用。
(这里是test.i,正常来说预处理完成之后生成的就是后缀为.i的文件) 然后打开test.i来看一下: 左边是test.c的内容,是我写的,右边是预处理之后的内容,上面的这些内容是头文件展开的内容...linux下默认的是使用动态链接。 如果想用静态链接就需要编译后面加上-static: 静态链接的内存也是非常之大,再用ldd去看的时候就会告诉我们不是靠动态链接执行的。...windows下的动态库和静态库后缀 动态库:.dll 静态库:.lib Linux项目自动化构建工具——make/Makefile make/Makefile是什么 make是一个命令,makefile...make/Makefile的使用 首先需要先创建makefile这个文件,必须叫这个名字,第一个M可以大写。...依赖方法必须以tab键开头,不能是四个空格键。 后面就是你实现依赖关系的依赖方法的操作。
为什么要有 makefile 我们在学习 Linux 的时候,一般都是直接通过 gcc 对源文件进行编译的,我们可以通过指定 gcc 的参数来指定生成什么样的文件、使用哪个库、在哪个路径搜索等等。...makefile 的自动推导功能是非常强大的,比如说我们定义变量 Src = 1.c 2.c 3.c ,假如说在生成 2.o 目标的时候,我们直接在 gcc 命令中使用变量 Src,它也可以推导出源文件为...因为大部分隐含规则都是使用了后缀规则来定义的,所以,只要隐含规则中有后缀列表,那么隐含规则就会生效。...include 关键字所在的行首可以含有(任意个)空格,这些空格在读取的时候会被自动忽略,但是,绝对不能使用 Tab 开始,因为 Tab 开始的都会被作为 shell 命令,会把 include 当作...但是了解 makefile 的语法、变量、函数、规则等等更深层次的知识也是非常有必要的。
领取专属 10元无门槛券
手把手带您无忧上云