15_Linux工程目录与顶层Makefile

这篇具有很好参考价值的文章主要介绍了15_Linux工程目录与顶层Makefile。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Linux 工程目录分析

顶层Makefile详解

make xxx_defconfig过程

Makefile.build脚本分析

make过程

built-in.o文件编译生成过程

make zImage过程


Linux 工程目录分析

将正点原子提供的Linux源码进行解压,解压完成以后的目录如图所示:

15_Linux工程目录与顶层Makefile 

 图就是正点原子提供的未编译的Linux源码目录文件,我们在分析Linux之前一定要先在Ubuntu中编译一下Linux,因为编译过程会生成一些文件,而生成的这些恰恰是分析Linux不可或缺的文件。

编译后的Linux目录如图所示: 

15_Linux工程目录与顶层Makefile

15_Linux工程目录与顶层Makefile 

15_Linux工程目录与顶层Makefile 

15_Linux工程目录与顶层Makefile 

arch目录

这个目录是和架构有关的目录,比如arm、arm64、avr32、x86等等架构。每种架构都对应一个目录,在这些目录中又有很多子目录,比如 boot、common、configs等等,以arch/arm为例,其子目录如图所示:

15_Linux工程目录与顶层Makefile 

 图是arch/arm的一部分子目录,这些子目录用于控制系统引导、系统调用、动态调·频、主频设置等。arch/arm/configs目录是不同平台的默认配置文件: xxx_defconfig,如图所示:

15_Linux工程目录与顶层Makefile

在arch/arm/configs中就包含有I.MX6U-ALPHA开发板的默认配置文件: imx_v7_defconfig,执行“make imx_v7_defconfig”即可完成配置。arch/arm/boot/dts 目录里面是对应开发平台的设备树文件,正点原子I.MX6U-ALPHA开发板对应的设备树文件如图所示:

15_Linux工程目录与顶层Makefile

 arch/arm/boot目录下会保存编译出来的Image和zImage镜像文件,而zimage就是我们要用的linux镜像文件。

arch/arm/mach-xxx目录分别为相应平台的驱动和初始化文件,比如mach-imx目录里面就是I.MX系列CPU的驱动和初始化文件。

block目录

block是Linux下块设备目录,像SD卡、EMMC、NAND、硬盘等存储设备就属于块设备,block目录中存放着管理块设备的相关文件。

crypto目录

.crypto目录里面存放着加密文件,比如常见的crc、crc32、md4、md5、hash等加密算法。

Documentation目录

此目录里面存放着Linux相关的文档,如果要想了解Linux某个功能模块或驱动架构的功能,就可以在Documentation目录中查找有没有对应的文档。

drivers目录

驱动目录文件,此目录根据驱动类型的不同,分门别类进行整理,比如drivers/i2c就是12C相关驱动目录, drivers/gpio就是GPIO相关的驱动目录,这是我们学习的重点。

 firmware目录

此目录用于存放固件。

fs目录

此目录存放文件系统,比如fs/ext2、fs/ext4、fs/f2fs等,分别是ext2、ext4和f2fs等文件系统。

include目录

头文件目录。

init目录

此目录存放Linux内核启动的时候初始化代码。

ipc目录

IPC为进程间通信,ipe目录是进程间通信的具体实现代码。

kernel目录

Linux内核代码。

lib目录

lib是库的意思,lib目录都是一些公用的库函。

mm目录

此目录存放内存管理相关代码。

net目录

此目录存放网络相关代码。

samples目录

此目录存放一些示例代码文件。

scripts目录

脚本目录,Linux 编译的时候会用到很多脚本文件,这些脚本文件就保存在此目录中。

security目录

此目录存放安全相关的文件。

sound目录

此目录存放音频相关驱动文件,音频驱动文件并没有存放到drivers目录中,而是单独的目录。

tools目录

此目录存放一些编译的时候使用到的工具。

usr目录

此目录存放与 initramfs 有关的代码。

virt目录

此目录存放虚拟机相关文件。

.config文件

跟uboot一样, .config保存着Linux最终的配置信息,编译Linux的时候会读取此文件中的配置信息。最终根据配置信息来选择编译Linux哪些模块,哪些功能。

Kbuild文件

有些Makefile会读取此文件。

Kconfig文件

图形化配置界面的配置文件。

Makefile文件

Linux顶层Makefile文件,建议好好阅读一下此文件。

README文件

此文件详细讲解了如何编译Linux源码,以及Linux源码的目录信息,建议仔细阅读一下此文件。

关于Linux源码目录就分析到这里,接下来分析一下Linux的顶层Makefile。

顶层Makefile详解

Linux的顶层Makefile和uboot的顶层Makefile非常相似,因为uboot 参考了Linux,前602行几乎一样,所以前面部分我们大致看一下就行了。

版本号

顶层Makefile一开始就是Linux内核的版本号,如下所示:

15_Linux工程目录与顶层Makefile 

可以看出,Linux内核版本号为4.1.15。 

MAKEFLAGS变量

MAKEFLAGS变量设置如下所示:

15_Linux工程目录与顶层Makefile

 

命令输出

Linux 编译的时候也可以通过“V=1”来输出完整的命令,这个和 uboot 一样,相关代码如下所示:

15_Linux工程目录与顶层Makefile 

 

静默输出

Linux编译的时候使用"make-s”就可实现静默编译,编译的时候就不会打印任何的信息,同uboot一样,相关代码如下:

15_Linux工程目录与顶层Makefile

 

设置编译结果输出目录

Linux编译的时候使用"O-xxx”即可将编译产生的过程文件输出到指定的目录中,相关代码如下:

15_Linux工程目录与顶层Makefile

 

代码检查

Linux也支持代码检查,使用命令“make C=1”使能代码检查,检查那些需要重新编译的文件。"make C=2”用于检查所有的源码文件,顶层Makefile中的代码如下:

15_Linux工程目录与顶层Makefile

 

模块编译

Linux允许单独编译某个模块,使用命令"make M=dir”即可,旧语法"make SUBDIRS=dir"也是支持的。顶层Makefile中的代码如下:

15_Linux工程目录与顶层Makefile

15_Linux工程目录与顶层Makefile 

 外部模块编译过程和uboot也一样,最终导出sretree、objtree和VPATH这三个变量的值,其中srctree=.,也就是当前目录, objtree同样为".”。

 

设置目标架构和交叉编译器

同 uboot一样,Linux编译的时候需要设置目标板架构ARCH 和交叉编译器CROSS_COMPILE,在顶层Makefile中代码如下:

15_Linux工程目录与顶层Makefile

 为了方便,一般直接修改顶层Makefile中的ARCH和CROSS_COMPILE,直接将其设置为对应的架构和编译器,将ARCH设置为为arm, CROSS-COMPILE设置为armlinux-gnueabihf-,如下所示:

15_Linux工程目录与顶层Makefile

 设置好以后我们就可以使用如下命令编译Linux了:

15_Linux工程目录与顶层Makefile

 

调用scripts/Kbuild.include文件

同uboot一样, Linux顶层Makefile也会调用文件scripts/Kbuild.include,顶层Makefile相应代码如下:

15_Linux工程目录与顶层Makefile

 

交叉编译工具变量设置

顶层Makefile中其他和交叉编译器有关的变量设置如下:

15_Linux工程目录与顶层Makefile 

15_Linux工程目录与顶层Makefile

 LA、LD、CC等这些都是交叉编译器所使用的工具。

头文件路径变量

顶层Makefile定义了两个变量保存头文件路径: USERINCLUDE和LINUXINCLUDE,相关代码如下:

15_Linux工程目录与顶层Makefile 

 第381~386行是USERINCLUDE是UAPI相关的头文件路径,第390~396行是LINUXINCLUDE是Linux内核源码的头文件路径。重点来看一下LINUXINCLUDE,其中srctree=., hdr-arch-arm, KBUILD_SRC 为空,因此, 将USERINCLUDE和LINUXINCLUDE展开以后为:

15_Linux工程目录与顶层Makefile 

 15_Linux工程目录与顶层Makefile

 

导出变量

顶层Makefile会导出很多变量给子Makefile使用,导出的这些变量如下:

15_Linux工程目录与顶层Makefile

 15_Linux工程目录与顶层Makefile

 

make xxx_defconfig过程

第一次编译Linux之前都要使用"make xxx_defconfig"先配置Linux内核,在顶层Makefile中有"%config”这个目标,如下所示:

15_Linux工程目录与顶层Makefile

15_Linux工程目录与顶层Makefile 

15_Linux工程目录与顶层Makefile 

15_Linux工程目录与顶层Makefile 

 第490-507行和uboot一样,都是设置定义变量config-targets、mixed-targets和dot-config的值,最终这三个变量的值为:

15_Linux工程目录与顶层Makefile

因为config-targets=1,因此第534行~541行成立。第534行引用arch/arm/Makefile 这个文件,这个文件很重要,因为zlmage, ulmage等这些文件就是由arch/arm/Makefile来生成的。

第535行导出变量KBUILD_DEFCONFIG KBUILD_KCONFIG。

第537行,没有目标与之匹配,因此不执行。

第540行, "make xxx_defconfig"与目标"%config"匹配,因此执行。"%config"依赖" scripts_basic,outputmakefile和FORCE,"%config"真正有意义的依赖就只有scripts_basic,scripts_basic的规则如下:

15_Linux工程目录与顶层Makefile

build定义在文件 scripts/Kbuild.include中

值为build :=-f S(srctree)/scripts/Makefile.buildobj,

因此将示例代码展开就是:

15_Linux工程目录与顶层Makefile

 接着回到示例代码35.5.1.1的目标“%config”处,内容如下:

15_Linux工程目录与顶层Makefile 

 将命令展开就是:

15_Linux工程目录与顶层Makefile

 

Makefile.build脚本分析

从可知,"make xxx_defconfig"配置Linux的时候如下两行命令会执行脚本scripts/Makefile.build:

15_Linux工程目录与顶层Makefile

 依次来分析一下:

scripts_basic目标对应的命令

scripts-basic目标对应的命令为: @make-f./scripts/Makefile.build obj-scripts/basic。打开文件scripts/Makefile.build,有如下代码:

15_Linux工程目录与顶层Makefile

15_Linux工程目录与顶层Makefile

 将kbuild-dir展开后为:

15_Linux工程目录与顶层Makefile

将kbuild-file展开后为: 

15_Linux工程目录与顶层Makefile

 最后将44行展开,:

15_Linux工程目录与顶层Makefile

 继续分析scripts/Makefile.build,如下代码:

15_Linux工程目录与顶层Makefile

build是默认目标,因为命令"@make-f /scripts/Makefile.build obj=scripts/basic"没有指定目标,所以会使用到默认目标_build。在顶层 Makefile 中,KBUILD_BUILTIN为1,KBUILD MODULES为空,因此展开后目标build为: 

15_Linux工程目录与顶层Makefile

可以看出目标_build有5个依赖: builtin-target、lib-target、extra-y、subdir-ym和always。这5个依赖的具体内容如下: 

15_Linux工程目录与顶层Makefile

 只有always有效,因此_build最终为:

15_Linux工程目录与顶层Makefile

 

%config目标对应的命令

目标对应的命令为:@make -f ./scripts/Makefile.build obj=scripts/kconfig%configxxx defconfig,此命令会使用到的各个变量值如下:

15_Linux工程目录与顶层Makefile

 可以看出, Makefile.build会读取scripts/kconfig/Makefile中的内容,此文件有如下所示内容:

15_Linux工程目录与顶层Makefile

 目标% defconfig与xxx_defconfig匹配,所以会执行这条规则,将其展开就是:

15_Linux工程目录与顶层Makefile

 %-defconfig依赖scripts/kconfig/conf,所以会编译scripts/kconfig/conf.c生成conf这个软件。此软件就会将%_defconfig 中的配置输出到.config文件中,最终生成Linux kemel根目录下的.config文件。

make过程

使用命令"make xxx_defconfig"配置好Linux内核以后就可以使用"make"或者"make all"命令进行编译。顶层Makefile有如下代码:

15_Linux工程目录与顶层Makefile

 第126行,_all是默认目标,如果使用命令“make”编译Linux的话此目标就会被匹配。

第193行,如果 KBUILD_EXTMOD为空的话194行的代码成立。

第194行,默认目标_all依赖all。

第608行,目标all依赖vmlinux,所以接下来的重点就是vmlinux!

顶层Makefile中有如下代码:

15_Linux工程目录与顶层Makefile

15_Linux工程目录与顶层Makefile

 从第920行可以看出目标vmlinux依赖scripts/link-vmlinux.sh $(vmlinux-deps) FORCE。第912 行定义了vmlinux-deps,值为:

15_Linux工程目录与顶层Makefile

第905行, KBUILD VMLINUX INIT-S(head-y) S(init-y)。

第906行, KBUILD_VMLINUX_MAIN=$(core-y) $(libs-y) $(drivers-y) $(net-y)。

第907行, KBUILD_LDS=arch/$(SRCARCH)/kernel/vmlinux.lds,其中SRCARCH=arm,因此 KBUILD LDS=arch/arm/kernel/vmlinux.lds。

综上所述, vmlinux的依赖为: scripts/link-vmlinux.sh、S(head-y) 、S(init-y)、$(core-y)、$(libs-y)、$(drivers-y)、$(net-y)、arch/arm/kernel/vmlinux.lds和FORCE

第933行的命令用于链接生成vmlinux.量的值。

重点来看一下$(head-y)、S(init-y)、S(core-y) 、$(libs-y)、S(drivers-y)和$(net-y)这六个变

 

 

head-y

head-y定义在文件arch/arm/Makefile中,内容如下:

15_Linux工程目录与顶层Makefile

 当不使能 MMU 的话 MMUEXT-nommu,如果使能MMU的话为空,因此head-y最终的值为:

15_Linux工程目录与顶层Makefile

 

init-y、drivers-y和net-y

在顶层Makefile中有如下代码:

15_Linux工程目录与顶层Makefile

 从示例代码35.5.3.4可知,init-y、libs-y、drivers-y和net-y最终的值为:

15_Linux工程目录与顶层Makefile

libs-y

libs-y基本和init-y一样,在顶层Makefile中存在如下代码:

15_Linux工程目录与顶层Makefile

 根据示例代码35.5.3.5可知,libs-y应该等于“lib.a built-in.o”,这个只正确了一部分!因为在arch/arm/Makefile中会向libs-y 中追加一些值,代码如下:

15_Linux工程目录与顶层Makefile

 .arch/arm/Makefile将libs-y的值改为了: arch/arm/lib $(libs-y),展开以后为:

15_Linux工程目录与顶层Makefile

 因此根据示例代码35.5.3.5的第900~902行可知,libs-y最终应该为:

15_Linux工程目录与顶层Makefile

 

core-y

core-y和init-y也一样,在顶层Makefile中有如下代码:

15_Linux工程目录与顶层Makefile

 但是在arch/arm/Makefile中会对core-y进行追加,代码如下:

15_Linux工程目录与顶层Makefile

15_Linux工程目录与顶层Makefile

第269-274行根据不同的配置向core-y追加不同的值,比如使能VFP的话就会在.config中有 CONFIG_VFP=y这一行,那么core-y就会追加“arch/arm/vfp/”。第277-282行就是对core-y直接追加的值。

在顶层Makefile中有如下一行:

15_Linux工程目录与顶层Makefile

 经过上述代码的转换,最终core-y的值为:

15_Linux工程目录与顶层Makefile 

 关于head-y、init-y、core-y、libs-y、drivers-y和net-y这6个变量就讲解到这里。这些变量都是一些built-in.o或a等文件,这个和uboot一样,都是将相应目录中的源码文件进行编译,然后在各自目录下生成built-in.o文件,有些生成了.a库文件。最终将这些built-in.o和.a文件进行链接即可形成ELF格式的可执行文件,也就是vmlinux!但是链接是需要链接脚本的,vmlinux的依赖arch/arm/kernel/vmlinux.lds就是整个Linux的链接脚本。

示例代码35.5.3.2第933行的命令

"+$(call if_changed,link-vmlinux)”表示将$(callif_changed,link-vmlinux)的结果作为最终生成vmlinux的命令,前面的“+”表示该命令结果不可忽略。$(call if_changed,link-vmlinux)是调用函数 if_changed, link-vmlinux 是函数 if_changed 的参数,函数if-changed定义在文件scripts/Kbuild.include中,如下所示:

15_Linux工程目录与顶层Makefile

 any-prereq用于检查依赖文件是否有变化,如果依赖文件有变化那么any-prereq就不为"空,否则就为空。arg-check用于检查参数是否有变化,如果没有变化那么arg-check就为空。

第248行, "@set-e”告诉bash,如果任何语句的执行结果不为true(也就是执行出错)的话就直接退出。

第249行, $(echo-cmd)用于打印命令执行过程,比如在链接vmlinux的时候就会输出“LINK vmlinux”。S(cmd_$(1))中的$(1)表示参数,也就是link-vmlinux,因此$(cmd_$(1)表示执行cmd link-vmlinux的内容。cmd link-vmlinux在顶层Makefile中有如下所示定义:

15_Linux工程目录与顶层Makefile

 第915行就是cmd_link-vmlinux的值,其中CONFIG_SHELL=/bin/bash,$<表示目标vmlinux的第一个依赖文件,根据示例代码35.5.3.2可知,这个文件为 scripts/link-vmlinux.sh。LD= arm-linux-gnueabihf-ld-EL,LDFLAGS 为空。LDFLAGS_vmlinux 的值由顶层Makefile 和arch/arm/Makefile这两个文件共同决定,最终LDFLAGS_vmlinux=-p --no-undefined -X--picveneer--build-id。因此 cmd_link-vmlinux最终的值为:

15_Linux工程目录与顶层Makefile

 cmd_link-vmlinux会调scripts/link-vmlinux.sh这个脚本来链接出 vmlinux!在linkvmlinux.sh 中有如下所示代码:

15_Linux工程目录与顶层Makefile

 

vmliux_link就是最终链接出vmlinux的函数,第55行判断SRCARCH是否等于"um",如"果不相等的话就执行56-58行的代码。因为SRCARCH-arm,因此条件成立,执行56-58行的代码。这三行代码就应该很熟悉了!就是普通的链接操作,连接脚本为Ids= /arch/arm/kernel/vmlinux.Ids,需要链接的文件由变量 KBUILD_VMLINUX_INIT 和KBUILD VMLINUX MAIN来决定,这两个变量在示例代码35.5.3.2中已经讲解过了。

第217行调用vmlinux_link函数来链接出vmlinux。

使用命令"make V=1”编译Linux,会有如图35.5.3.1所示的编译信息:

15_Linux工程目录与顶层Makefile

 至此我们基本理清了make的过程,重点就是将各个子目录下的built-in.o、.a 等文件链接在一起,最终生成vmlinux这个ELF格式的可执行文件。链接脚本为arch/arm/kernel/vmlinux.lds,链接过程是由 shell 脚本 scripts/link-vmlinux.s 来完成的。接下来的问题就是这些子目录下的 builtin.o、.a 等文件又是如何编译出来的呢?

built-in.o文件编译生成过程

根据示例代码35.5.3.2第920行可知,vmliux依赖vmlinux-deps,而 vmlinux-deps=$(KBUILD_LDS)$(KBUILD_VMLINUX_INIT)$(KBUILD_VMLINUX_MAIN), KBUILD_LDS是链接脚本,这里不考虑,剩下的KBUILD-VMLINUX-INIT和KBUILD-VMLINUX-MAIN就是各个子目录下的 built-in.o、a等文件。最终 vmlinux-deps 的值如下:

15_Linux工程目录与顶层Makefile

 除arch/arm/kernel/vmlinux.lds以外,其他都是要编译链接生成的。在顶层Makefile中有如下代码:

15_Linux工程目录与顶层Makefile

 sort是排序函数,用于对vmlinux-deps的字符串列表进行排序,并且去掉重复的单词。可以看出vmlinux-deps依赖vmlinux-dirs, vmlinux-dirs也定义在顶层Makefile中,定义如下:

15_Linux工程目录与顶层Makefile

15_Linux工程目录与顶层Makefile

 值如下:vmlinux-dirs看名字就知道和目录有关,此变量保存着生成vmlinux所需源码文件的目录值如下:

15_Linux工程目录与顶层Makefile

 在顶层Makefile中有如下代码:

15_Linux工程目录与顶层Makefile

 目标vmlinux-dirs依赖prepare和scripts,这两个依赖不去浪费时间了,重点看一下第947行的命令。build前面已经说了,值为"-f./scripts/Makefile.build obj”,因此将947行的命令展开就是:

15_Linux工程目录与顶层Makefile

$@表示目标文件,也就是vmlinux-dirs的值,"将vmlinux-dirs中的这些目录全部带入到命令中,结果如下: 

15_Linux工程目录与顶层Makefile

15_Linux工程目录与顶层Makefile

这些命令运行过程其实都是一样的,我们就以“@ make-f Jscripts/Makefile.build obj-init”这个命令为例,讲解一下详细的运行过程。这里又要用到Makefile.build这个脚本了,此脚本默认目标为_build,再来看一下,_build目标对应的规则如下: 

15_Linux工程目录与顶层Makefile

当只编译Linux内核镜像文件,也就是使用“make zImage”编译的时候,.KBUILD_BUILTIN=1,KBUILD_MODULES为空。“make”命令是会编译所有的东西,包括Linux内核镜像文件和一些模块文件。如果只编译Linux内核镜像的话,_build目标简化为: 

15_Linux工程目录与顶层Makefile

重点来看一下builtin-target这个依赖,builtin-target同样定义在文件 scripts/Makefile.build,_中,定义如下: 

15_Linux工程目录与顶层Makefile

 第87行就是builtin-target变量的值,为“S(obj)/built-in.o”,这就是这些 built-in.o 的来源了。要生成 built-in.o,要求 obj-y、obj-m、obj-、subdir-m 和 lib-target 这些变量不能全部为空。最后一个问题:built-in.o是怎么生成的?在文件 scripts/Makefile.build中有如下代码:

15_Linux工程目录与顶层Makefile

15_Linux工程目录与顶层Makefile

第336行的目标就是builtin-target,依赖为obj-y,命令为"$(call if_changed,link_o_target)",也就是调用函数if changed,参数为link o target,其返回值就是具体的命令。前面讲过了.if_changed,它会调用 cmd_$(1)所对应的命令($(1)就是函数的第1个参数),在这里就是调用cmd_link_o_target 所对应的命令,也就是第331~334行的命令。cmd_link_o_target就是使用 LD将某个目录下的所有.o文件链接在一起,最终形成built-in.o。

make zImage过程

vmlinux、Image, zImage、ulmage的区别

前面重点是讲vmlinux是如何编译出来的, vmlinux是ELF格式的文件,但是在实际中我们不会使用 vmlinux,而是使用zImage或ulmage这样的Linux内核镜像文件。那么vmlinux、zImage、ulmage 他们之间有什么区别呢?

vmlinux是编译出来的最原始的内核文件,是未压缩的,比如正点原子提供的Linux源码编译出来的vmlinux差不多有16MB,如图所示:

15_Linux工程目录与顶层Makefile

 Image是Linux内核镜像文件,但是Image仅包含可执行的二进制数据。Image就是使用objcopy取消掉vmlinux中的一些其他信息,比如符号表什么的。但是Image是没有压缩过的,Image保存在arch/arm/boot目录下,其大小大概在12MB左右如图所示:

15_Linux工程目录与顶层Makefile

相比vmlinux的16MB,Image缩小到了12MB。 

zImage是经过gzip压缩后的Image,经过压缩以后其大小大概在6MB左右,如图所示:

15_Linux工程目录与顶层Makefile

ulmage是老版本uboot专用的镜像文件,ulmag是在zImage前面加了一个长度为 64字节的“头”,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。但是新的uboot已经支持了zImage启动!所以已经很少用到ulmage了,除非你用的很古老的uboot

使用"make"、"make all"、 "make zImage"这些命令就可以编译出zImage镜像,在arch/arm/Makefile中有如下代码:

15_Linux工程目录与顶层Makefile 

15_Linux工程目录与顶层Makefile

第310行,变量BOOT_TARGETS包含zImage, Image, xipImage等镜像文件。

第315行, BOOT_TARGETS依赖vmlinux,因此如果使用"make zImage"编译的Linux内核的话,首先肯定要先编译出 vmlinux。

第316行,具体的命令,比如要编译zImage,那么命令展开以后如下所示:

15_Linux工程目录与顶层Makefile

 看来又是使用scripts/Makefile.build文件来完成vmlinux到zImage的转换。

基本和uboot的顶层Makefile一样,重点在于vmlinux的生成。最后将vmlinux压缩成我们最常用的zImage或ulmage等文件。文章来源地址https://www.toymoban.com/news/detail-461545.html

到了这里,关于15_Linux工程目录与顶层Makefile的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记一次基于FPGA的VGA显示四操作数计算器工程的开发流程——(1)从顶层设计说起

    首先值得说明的是,在这个项目几乎完成之际,笔者才愈发体会到了硬件思维和软件思维的云泥之别。不幸的是,在此项目的实现过程中,绝大部分代码的思维仍然是软件思维,因此该项目主要模块的设计部分可能并不能体现硬件操作的独到之处,不符合硬件工程师的基本设

    2024年02月04日
    浏览(31)
  • 搭建 Makefile+OpenOCD+CMSIS-DAP+Vscode arm-none-eabi-gcc 工程模板

    Arm-none-eabi-gcc + Makefile+OpenOCD+CMSIS-DAP+Vscode工程模板 一、本次环境搭建所用的软硬件 1)Windows or Linux (本文以Windows为主) 2)JLink、Daplink、Wch-Link烧录器 3)GNU Arm Embedded Toolchain交叉编译器 4)Mingw-w64 GCC for Windows 64 5)Debug 调试工具 openocd 6)Visual Studio Code 二、软件安装配置 GNU Arm

    2024年02月03日
    浏览(38)
  • 基于ubuntu的STM32嵌入式软件开发(四)——应用软件工程的修改、Makefile及编译脚本的编写

            本文主要介绍基于标准库函数移植的STM32的应用软件工程的修改,主要涉及到文件内容修改、Makefile文件编写、编译脚本编写等内容,其中编译脚本是基于arm-none-eabi-gcc的交叉编译器撰写的。程序亲测可以正常编译,生成.bin和.hex的可烧录镜像文件。 1.首先修改 pr

    2023年04月15日
    浏览(33)
  • Linux中makefile

      第一个版本的makefile Makefile的依赖是从上至下的,换句话说就是 目标文件是第一句里的目标 , 如果不满足执行依赖,就会继续向下执行 。 如果满足了生成目标的依赖,就不会再继续向下执行了 。 Make会自动寻找依赖条件所用到的文件,  其中,我们可以在中makefile文件中

    2024年02月17日
    浏览(28)
  • Linux运维:makefile

    Makefile 是一种用于自动化构建的文件,它描述了一个软件项目的编译规则和依赖关系,并提供了一些工具来自动执行这些规则。 Makefile 的主要作用如下: 自动化编译:通过 Makefile,可以定义项目中的编译规则和依赖关系。这样,当源代码发生变化时,只需要执行 make 命令,

    2024年02月06日
    浏览(25)
  • Linux--make & makefile

    make 工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能, 而是用类似于批处理的方式—— 通过调用 makefile 文件中用户指定的命令来进行编译和链接的 。 makefile 命令中就包含了调用 gcc(也可以是别的编译器)去编译某个源文件的命令。 makefile 在一些简

    2024年02月12日
    浏览(28)
  • linux系统编程(2)--Makefile

    一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系

    2023年04月09日
    浏览(18)
  • Linux中Makefile详细教程

    目录 Makefile Makefile的介绍 Makefile简单的编写 .PHONY 问题: 如果只执行make,它执行的是Makefile里哪一段语句呢? 怎么知道我的可执行程序是最新的呢? Makefile编译多个文件 进度条小程序 make是一个命令 makefile/Makefile是一个文件. 1.什么是Makefile脚本?     Makefile脚本集合了程序

    2024年02月09日
    浏览(28)
  • keil移植linux(makefile)

    ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 stlink 9-24v可调电源 robomaster A 板 1)修改cubeMX配置 选择makefile 2)setting设置 3)launch设置 修改成以下内容:可执行文件名是freeRTOS_LED.elf 4)修改makefile makefile中只包含工程生成的src文件,没有包含applications中的编写的 .c 文件 make,报错内

    2024年02月01日
    浏览(25)
  • Linux:编写编译脚本Makefile文件

    一、生成可执行文件 1、一个源文件编译 本例子主要区别.c及.cpp文件及编译该文件时使用的编译链。 1).c文件 2) .cpp文件 经过以上测试,总结如下: 以.cpp为后缀的文件,为c++代码。代码最好使用C++语言。也可以使用c语言。 a 代码使用c++语言,编译时必须要用g++,不能使用

    2024年02月11日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包