makefile
总阅读次
在linux下编写C程序一般要通过make工程管理器完成编译,编译过程分为编译、汇编、链接3个阶段。在编译过阶段自动读入makefile文件(makefile的内容)来执行编译工作。同时根据文件时间戳自动发现更新过的文件而减少编译的过程。
规则的格式
1 | target(目标): dependency_files(依赖文件) |
内核源码中的make
设置编译器路径
1
2
3
4
5export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi- #这个与.bashrc中的编译器一样
#CROSS_COMPILE ?= /usr/local/arm/4.5.1/bin/arm-none-linux-gnueabi-
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)强制编译
源码开发者强制要求编译进内核的文件
打开内核源码中drivers/Makefile文件
类似下面写法,只要编译内核就必须编译这个文件
1 | obj-y += gpio/ |
- 配置编译
通过源码中Kconfig 配置选择编译
例如打开drivers/char/Makefile文件如果定义了宏文件1
2
3
4
5obj-$(CONFIG_MAX485_CTL) += max485_ctl.o
obj-$(CONFIG_LEDS_CTL) += itop4412_leds.o
obj-$(CONFIG_BUZZER_CTL) += itop4412_buzzer.o
obj-$(CONFIG_ADC_CTL) += itop4412_adc.o
obj-$(CONFIG_RELAY_CTL) += itop4412_relay.o如果定义了这个宏 CONFIG_LEDS_CT 把itop4412/leds.c编译成.o文件
CONFIG_LEDS_CTL这个宏在源码中.config中定义了
1
2
3
4
5
6CONFIG_S3C_MEM=y
CONFIG_EXYNOS_MEM=y
CONFIG_GPS_PM=y
CONFIG_MAX485_CTL=y
CONFIG_HELLO_CTL=y
CONFIG_LEDS_CTL=y
在menuconfig中配置,编译根据.config中宏是否定义而进行编译
- 依赖编译
– 一个驱动的编译需要另外驱动的支持
– 这一部分不需要另外写编译脚本,只需要在Kconfig中配置即可
• 例如显卡驱动VIDEO_JPEG_V2X中需要MEDIA_SUPPORT等驱动,那么编
译显卡驱动的同时也需要将依赖的驱动选上
make menuconfig调用scripts通过各级Kconfig文件构成menuconfig配置界面 保存生成config
强制编译无法在menucofing配置
执行Make ,编译器找各级Makefile生成zImage二进制镜像
实例
实例1.
驱动进内核
在menuconfig选中
在4412目标版上执行
1 | [root@iTOP-4412] |
在PC上烧写zImgae
1 | D:\T\platform-tools>fastboot.exe flash kernel zImage |
在目标板上查询
1 | [root@iTOP-4412]# ls /dev/led* |
如果重新在menuconfig不选择
1 | [*] Enable LEDS config |
则在重新给开发板烧写zImage是则不能查询到leds
1
2 [root@iTOP-4412]# ls /dev/led*
ls: /dev/led*: No such file or directory
makefile实例解读
1 | TARGET = ../../debug/libGate_Gunnebo.so |
make中报错
1 | ../release/libPCM_YCMJX.so:CFLAGS= -g |
- make: *** No rule to make target ‘MIS_Commonality.cpp’, needed by ‘MIS_Commonality.o’. Stop.
解决:
makefile里面的文件依赖关系有问题,导致头文件找不到。
解决办法:
把MIS_Commonality/MIS_Commonality.cpp
这个目录文件放到相应的位置,即可
No rule to make target
解决:1
2
3root@vmubuntu:/home/takethat/test_so/class_dynamic# make
rm -rf *.so a.out b.out
make: *** No rule to make target `test_1.o', needed by `test_1.so'. Stop.
目标文件的依赖文件不存在也可能是依赖文件名对不上
- make j* make j4 make j8 区别
https://blog.csdn.net/androiddeveloper_lee/article/details/32136261
tipsl:
[shell脚本及makefile中的特殊变量] 5