要了解一个LINUX工程的结构必须看懂Makefile
linux中的make命令的详细解释

linux中的make命令的详细解释linxu下的make命令是一个GNU下的工程化编译工具。
下面由店铺为大家整理了linux的make命令的详细解释的相关知识,希望对大家有帮助!一、linux中的make命令的详细解释make命令是GNU的工程化编译工具,用于编译众多相互关联的源代码问价,以实现工程化的管理,提高开发效率。
语法make(选项)(参数)选项-f:指定“makefile”文件;-i:忽略命令执行返回的出错信息;-s:沉默模式,在执行之前不输出相应的命令行信息;-r:禁止使用build-in规则;-n:非执行模式,输出所有执行命令,但并不执行;-t:更新目标文件;-q:make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息;-p:输出所有宏定义和目标文件描述;-d:Debug模式,输出有关文件和检测时间的详细信息。
Linux下常用选项与Unix系统中稍有不同,下面是不同的部分:-c dir:在读取 makefile 之前改变到指定的目录dir;-I dir:当包含其他 makefile文件时,利用该选项指定搜索目录;-h:help文挡,显示所有的make选项;-w:在处理 makefile 之前和之后,都显示工作目录。
参数目标:指定编译目标。
二、Linux中的make命令详解实例1. 一个简单的例子为了编译整个工程,你可以简单的使用 make 或者在 make 命令后带上目标 all。
$ makegcc -c -Wall test.cgcc -c -Wall anotherTest.cgcc -Wall test.o anotherTest.o -o test你能看到 make 命令第一次创建的依赖以及实际的目标。
如果你再次查看目录内容,里面多了一些 .o 文件和执行文件:$ lsanotherTest.c anotherTest.o Makefile test test.c test.h test.o 现在,假设你对 test.c 文件做了一些修改,重新使用 make 编译工程:$ makegcc -c -Wall test.cgcc -Wall test.o anotherTest.o -o test你可以看到只有 test.o 重新编译了,然而另一个 Test.o 没有重新编译。
Linux系统的Makefile和Kconfig及模块简介

Linux系统的Makefile、Kconfig和模块1Makefile1.1Makefile组织层次Linux的Make体系由如下几部分组成:Ø顶层Makefile顶层Makefile通过读取配置文件,递归编译内核代码树的相关目录,从而产生两个重要的目标文件:vmlinux和模块。
Ø内核相关Makefile位于arch/$(ARCH) 目录下,为顶层Makefile提供与具体硬件体系结构相关的信息。
Ø公共编译规则定义文件。
包括Makefile.build 、Makefile.clean、Makefile.lib、Makefile.host等文件组成。
这些文件位于scripts目录中,定义了编译需要的公共的规则和定义。
Ø内核配置文件 .config通过调用make menuconfig或者make xconfig命令,用户可以选择需要的配置来生成期望的目标文件。
Ø其他Makefile主要为整个Makefile体系提供各自模块的目标文件定义,上层Makefile根据它所定义的目标来完成各自模块的编译。
1.2Makefile的使用在编译内核之前,用户必须首先完成必要的配置。
Linux内核提供了数不胜数的功能,支持众多的硬件体系结构,这就需要用户对将要生成的内核进行裁减。
内核提供了多种不同的工具来简化内核的配置。
make config,字符界面下命令行工具,这个工具会依次遍历内核所有的配置项,要求用户进行逐项的选择配置。
这个工具会耗费用户太多时间,除非万不得以(你的编译主机不支持其他配置工具)一般不建议使用。
make menuconfig,基于ncurse库编制的图形界面工具,一般台式机使用该工具。
make xconfig,基于X11的图形配置工具,一般用于工作站环境。
当用户完成配置后,配置工具会自动生成.config文件,它被保存在内核代码树的根目录下。
linux make的命令行参数

linux make的命令行参数Linux make是一个非常重要的工具,用来自动构建项目和生成软件。
make命令行参数可以用来指定构建目标、编译器选项、目标平台等参数。
以下是常见的Linux make命令行参数:1. -f:指定目标文件名。
例如make -f makefile表示使用makefile文件构建项目。
2. -j:指定并行构建的进程数。
例如make -j4表示使用4个进程并行构建。
3. -C:指定目标目录。
例如make -C /usr/src/kernel表示在/usr/src/kernel目录下构建项目。
4. -k:表示忽略错误,继续构建。
例如make -k表示继续构建即使出现错误。
5. -n:表示模拟构建,不实际执行构建。
例如make -n表示打印出构建过程但不实际构建。
6. -B或--always-make:表示强制重新构建。
例如make -B表示强制重新构建所有目标文件。
7. -r或--no-builtin-rules:表示禁用内置规则。
例如make -r表示禁用内置规则,只使用自定义规则。
8. -s或--silent或--quiet:表示禁止输出构建详细信息。
例如make -s表示禁止输出构建详细信息。
9. -v或--version:表示显示make版本信息。
例如make -v表示显示make版本信息。
10. -h或--help:表示显示make命令的帮助信息。
例如make -h表示显示make命令的帮助信息。
以上命令是常见的make命令行参数,可以根据实际需求选择使用。
Make命令完全详解教程

Make命令完全详解教程无论是在Linux还是在Unix环境中,make都是一个非常重要的编译命令。
不管是自己进行项目开发还是安装应用软件,我们都经常要用到make或make install。
利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。
而且如此多的源文件,如果每次都要键入gcc命令进行编译的话,那对程序员来说简直就是一场灾难。
而make工具则可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。
因此,有效的利用make和makefile工具可以大大提高项目开发的效率。
同时掌握make和makefile之后,您也不会再面对着Linux下的应用软件手足无措了。
一、Make程序的命令行选项和参数Make命令参数的典型序列如下所示:make [-f makefile文件名][选项][宏定义][目标]这里用[]括起来的表示是可选的。
命令行选项由破折号“–”指明,后面跟选项,如也可以每个选项使用一个破折号,如甚至混合使用也行,如Make命令本身的命令行选项较多,这里只介绍在开发程序时最为常用的三个,它们是:–k:如果使用该选项,即使make程序遇到错误也会继续向下运行;如果没有该选项,在遇到第一个错误时make程序马上就会停止,那么后面的错误情况就不得而知了。
我们可以利用这个选项来查出所有有编译问题的源文件。
–n:该选项使make程序进入非执行模式,也就是说将原来应该执行的命令输出,而不是执行。
–f :指定作为makefile的文件的名称。
如果不用该选项,那么make程序首先在当前目录查找名为makefile的文件,如果没有找到,它就会转而查找名为Makefile的文件。
如果您在Linux下使用GNU Make的话,它会首先查找GNUmakefile,之后再搜索makefile和Makefile。
粗略走走kbuild makefile编译流程

kbuild是Linux内核源码中用于管理和构建内核的工具,而makefile 是kbuild的一种配置文件,用于定义内核的编译规则和依赖关系。
本文将对kbuild makefile的编译流程进行详细介绍,包括编译环境的搭建、makefile的结构和语法、编译过程中各个阶段的功能以及常见问题的解决方法。
一、编译环境的搭建1. 安装必要的工具和软件在开始编译之前,首先需要在系统中安装必要的工具和软件,包括gcc、g++、make等。
这些工具和软件通常可以通过系统自带的包管理工具进行安装,或者从官方全球信息湾下载安装包手动安装。
2. 下载内核源码要进行内核的编译,首先需要下载Linux内核的源码。
可以通过git clone命令从官方git仓库中下载源码,也可以从官方全球信息湾下载压缩包并解压缩到本地。
3. 配置编译环境在下载完内核源码后,需要对编译环境进行配置,包括设置环境变量、配置编译选项等。
可以通过修改bashrc文件或者使用export命令来设置环境变量,也可以通过配置.config文件来设置编译选项。
二、makefile的结构和语法1. makefile的基本结构makefile是一个文本文件,通常包含了一系列的规则、变量和注释。
makefile的基本结构如下:target: dependencies[tab] mand其中,target表示目标文件,dependencies表示target依赖的文件mand表示生成target的命令。
每条规则都必须以tab键开始,表示该规则的命令。
2. makefile的语法makefile支持一些基本的语法和操作符,包括赋值运算符、条件语句、循环语句等。
通过这些语法和操作符,可以方便地定义编译规则和依赖关系,实现自动化编译。
三、编译过程中各个阶段的功能1. 准备阶段在准备阶段,make工具会读取makefile文件,并解析其中的规则和依赖关系。
它会根据目标文件和依赖文件的时间戳来确定哪些文件需要重新编译,哪些文件可以跳过。
Linux之make的用法讲解

Linux之make的⽤法讲解在 Linux环境下使⽤ GNU 的 make⼯具能够⽐较容易的构建⼀个属于你⾃⼰的⼯程,整个⼯程的编译只需要⼀个命令就可以完成编译、连接以⾄于最后的执⾏。
不过这需要我们投⼊⼀些时间去完成⼀个或者多个称之为 Makefile ⽂件的编写。
此⽂件正是 make 正常⼯作的基础。
make 是⼀个命令⼯具,它解释 Makefile 中的指令(应该说是规则)。
在 Makefile⽂件中描述了整个⼯程所有⽂件的编译顺序、编译规则。
准备知识:编译,链接,静态库,共享库编译:把⾼级语⾔所书写的代码转换成机器可识别的指令,此时还不能够被执⾏,编译器通过检查⾼级语⾔的语法,函数和变量的声明是否正确!如果正确则产⽣中间⽬标⽂件(⽬标⽂件在Liunx中默认后缀为“.o”)链接:将多.o ⽂件,或者.o ⽂件和库⽂件链接成为可被操作系统执⾏的可执⾏程序静态库:⼜称为⽂档⽂件(Archive File)。
它是多个.o⽂件的集合。
Linux中静态库⽂件的后缀为“.a”共享库:也是多个.o ⽂件的集合,但是这些.o ⽂件时有编译器按照⼀种特殊的⽅式⽣成(共享库已经具备了可执⾏条件)在执⾏ make 之前,需要⼀个命名为 Makefile 的特殊⽂件(本⽂的后续将使⽤Makefile 作为这个特殊⽂件的⽂件名)来告诉 make 需要做什么(完成什么任务),该怎么做。
当使⽤make ⼯具进⾏编译时,⼯程中以下⼏种⽂件在执⾏make 时将会被编译(重新编译):1.所有的源⽂件没有被编译过,则对各个 C 源⽂件进⾏编译并进⾏链接,⽣成最后的可执⾏程序;2.每⼀个在上次执⾏ make 之后修改过的 C 源代码⽂件在本次执⾏make 时将会被重新编译;3.头⽂件在上⼀次执⾏make 之后被修改。
则所有包含此头⽂件的 C 源⽂件在本次执make 时将会被重新编译。
Makefile规则介绍⼀个简单的 Makefile 描述规则组成:TARGET... : PREREQUISITES...COMMAND......target:规则的⽬标。
linux vscode makefile语法

linux vscode makefile语法在Linux 系统中,如果您想使用VSCode 编写Makefile 相关的项目,可以参考以下步骤进行安装和配置:1. 首先,确保已经正确安装了Visual Studio Code。
如果尚未安装,可以参考[1] 中的教程进行安装。
2. 安装Makefile 插件。
打开VSCode,转到“扩展”选项卡(快捷键:Ctrl+Shift+X),搜索“Makefile”,找到名为“Makefile Support”的插件,点击“安装”。
3. 创建一个新的Makefile 项目。
在VSCode 中,创建一个新的文件夹,然后在该文件夹中打开终端(快捷键:Ctrl+`)。
4. 编写Makefile 语法。
在项目根目录下创建一个名为“Makefile”的文件,然后编写相应的Makefile 语法。
以下是一个简单的示例:```make# 设置变量MY_PROJECT_NAME = MyProjectMY_PROJECT_VERSION = 1.0# 设置目标all: build# 构建目标build:echo "Building $MY_PROJECT_NAME $MY_PROJECT_VERSION"# 在这里添加您的构建命令,例如:cmake、make等# 清理目标clean:echo "Cleaning $MY_PROJECT_NAME"# 在这里添加您的清理命令,例如:rm -rf build/# 默认执行构建目标default: build```5. 保存Makefile 文件并按F5 键运行项目。
VSCode 将会自动使用内置的终端执行Makefile 中的命令。
6. 如果需要使用GPU 加速构建,可以在Makefile 中添加相应的NVIDIA CUDA 或者AMD OpenCL 命令。
例如,如果您使用的是NVIDIA GPU,可以添加以下命令:```makebuild_gpu:echo "Building $MY_PROJECT_NAME $MY_PROJECT_VERSION using GPU"# 在这里添加您的GPU 构建命令,例如:nvcc、cuda编译器等```7. 按照项目需求修改Makefile 中的命令和目标。
linux中make的用法

linux中make的用法
make是一个常用的Linux命令,用于自动化编译和安装程序。
它可以读取Makefile文件,根据文件中的指令来执行一系列操作。
make指令可以根据源代码的变化,只编译需要重新编译的文件,从而加快编译速度。
使用make指令需要掌握基本的语法和参数,例如: 1. make [目标文件]:编译指定目标文件,如果不指定则编译Makefile中的默认目标。
2. make clean:清除已编译的文件。
3. make all:编译当前目录下的所有文件。
4. make install:安装已编译的文件。
在使用make指令前,需要确保已安装相关开发工具和编译器。
此外,对于不同的编程语言和工具链,make指令的使用也存在差异。
因此,在使用make指令时需要结合具体情况进行学习和实践。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
要了解一个LINUX工程的结构必须看懂Makefile,尤其是顶层的,没办法,UNIX世界就是这么无奈,什么东西都用文档去管理、配置。
首先在这方面我是个新手,时间所限只粗浅地看了一些Makefile规则。
以smdk_2410为例,顺序分析Makefile大致的流程及结构如下:1) Makefile中定义了源码及生成的目标文件存放的目录,目标文件存放目录BUILD_DIR可以通过make O=dir 指定。
如果没有指定,则设定为源码顶层目录。
一般编译的时候不指定输出目录,则BUILD_DIR为空。
其它目录变量定义如下:#OBJTREE和LNDIR为存放生成文件的目录,TOPDIR与SRCTREE为源码所在目录OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))SRCTREE := $(CURDIR)TOPDIR := $(SRCTREE)LNDIR := $(OBJTREE)export TOPDIR SRCTREE OBJTREE2)定义变量MKCONFIG:这个变量指向一个脚本,即顶层目录的mkconfig。
MKCONFIG := $(SRCTREE)/mkconfigexport MKCONFIG在编译U-BOOT之前,先要执行# make smdk2410_configsmdk2410_config是Makefile的一个目标,定义如下:smdk2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0unconfig:@rm -f $(obj)include/config.h $(obj)include/config.mk /$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp显然,执行# make smdk2410_config时,先执行unconfig目标,注意不指定输出目标时,obj,src变量均为空,unconfig下面的命令清理上一次执行make*_config时生成的头文件和makefile的包含文件。
主要是include/config.h 和include/config.mk文件。
然后才执行命令@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 MKCONFIG 是顶层目录下的mkcofig脚本文件,后面五个是传入的参数。
对于smdk2410_config而言,mkconfig主要做三件事:在include文件夹下建立相应的文件(夹)软连接,#如果是ARM体系将执行以下操作:#ln -s asm-arm asm#ln -s arch-s3c24x0 asm-arm/arch#ln -s proc-armv asm-arm/proc生成Makefile包含文件include/config.mk,内容很简单,定义了四个变量:ARCH = armCPU = arm920tBOARD = smdk2410SOC = s3c24x0生成include/config.h头文件,只有一行:/* Automatically generated - do not edit */#include "config/smdk2410.h"mkconfig脚本文件的执行至此结束,继续分析Makefile剩下部分。
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp3)包含include/config.mk,其实也就相当于在Makefile里定义了上面四个变量而已。
4) 指定交叉编译器前缀:ifeq ($(ARCH),arm)#这里根据ARCH变量,指定编译器前缀。
CROSS_COMPILE = arm-linux-endif5)包含config.mk:#包含顶层目录下的config.mk,这个文件里面主要定义了交叉编译器及选项和编译规则# load other configurationinclude $(TOPDIR)/config.mk下面分析config.mk的内容:@包含体系,开发板,CPU特定的规则文件:ifdef ARCH #指定预编译体系结构选项sinclude $(TOPDIR)/$(ARCH)_config.mk # include architecture dependend rulesendififdef CPU #定义编译时对齐,浮点等选项sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules endififdef SOC #没有这个文件sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # include SoC specific rulesendififdef BOARD #指定特定板子的镜像连接时的内存基地址,重要!sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rulesendif@定义交叉编译链工具# Include the make variables (CC, etc...)AS = $(CROSS_COMPILE)asLD = $(CROSS_COMPILE)ldCC = $(CROSS_COMPILE)gccCPP = $(CC) -EAR = $(CROSS_COMPILE)arNM = $(CROSS_COMPILE)nmSTRIP = $(CROSS_COMPILE)stripOBJCOPY = $(CROSS_COMPILE)objcopyOBJDUMP = $(CROSS_COMPILE)objdumpRANLIB = $(CROSS_COMPILE)RANLIB@定义AR选项ARFLAGS,调试选项DBGFLAGS,优化选项OPTFLAGS 预处理选项CPPFLAGS,C编译器选项CFLAGS,连接选项LDFLAGSLDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS) #指定了起始地址TEXT_BASE@指定编译规则:$(obj)%.s: %.S$(CPP) $(AFLAGS) -o $@ $<$(obj)%.o: %.S$(CC) $(AFLAGS) -c -o $@ $<$(obj)%.o: %.c$(CC) $(CFLAGS) -c -o $@ $<回到顶层makefile文件:6)U-boot需要的目标文件。
OBJS = cpu/$(CPU)/start.o # 顺序很重要,start.o必须放第一位7)需要的库文件:LIBS = lib_generic/libgeneric.aLIBS += board/$(BOARDDIR)/lib$(BOARD).aLIBS += cpu/$(CPU)/lib$(CPU).aifdef SOCLIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).aendifLIBS += lib_$(ARCH)/lib$(ARCH).aLIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.afs/jffs2/libjffs2.a /fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.aLIBS += net/libnet.aLIBS += disk/libdisk.aLIBS += rtc/librtc.aLIBS += dtt/libdtt.aLIBS += drivers/libdrivers.aLIBS += drivers/nand/libnand.aLIBS += drivers/nand_legacy/libnand_legacy.aLIBS += drivers/sk98lin/libsk98lin.aLIBS += post/libpost.a post/cpu/libcpu.aLIBS += common/libcommon.aLIBS += $(BOARDLIBS)LIBS := $(addprefix $(obj),$(LIBS)).PHONY : $(LIBS)根据上面的include/config.mk文件定义的ARCH、CPU、BOARD、SOC这些变量。
硬件平台依赖的目录文件可以根据这些定义来确定。
SMDK2410平台相关目录及对应生成的库文件如下。
board/smdk2410/ :库文件board/smdk2410/libsmdk2410.acpu/arm920t/ :库文件cpu/arm920t/libarm920t.acpu/arm920t/s3c24x0/ :库文件cpu/arm920t/s3c24x0/libs3c24x0.alib_arm/ :库文件lib_arm/libarm.ainclude/asm-arm/ :下面两个是头文件。
include/configs/smdk2410.h8)最终生成的各种镜像文件:ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map$(U_BOOT_NAND)all: $(ALL)$(obj)u-boot.hex: $(obj)u-boot$(OBJCOPY) ${OBJCFLAGS} -O ihex $< $@$(obj)u-boot.srec: $(obj)u-boot$(OBJCOPY) ${OBJCFLAGS} -O srec $< $@$(obj)u-boot.bin: $(obj)u-boot$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@#这里生成的是U-boot 的ELF文件镜像$(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT) UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e''''''''''''''''''''''''''''''''s/.*/(__u_boot_cmd_.*/)/-u/1/p''''''' '''''''''''''''''''''''''|sort|uniq`;/cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) /--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) /-Map u-boot.map -o u-boot分析一下最关键的u-boot ELF文件镜像的生成:@依赖目标depend:生成各个子目录的.depend文件,.depend列出每个目标文件的依赖文件。