找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2725|回复: 0
打印 上一主题 下一主题
收起左侧

MAKEFILE 心得(原创)

[复制链接]
跳转到指定楼层
楼主
ID:162366 发表于 2017-1-19 07:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
make 程序接受了 -C选项面在参数它自己先跳到 -C后面选项的目录中在解析Makefile执行Makefile的命令
  make -C bsp/uboot -f $(UBOOT_MAK) clean
-k:发现错误继续编译
  -n:输出要执行的步骤但不执行,如($ make -n -f Makefile hello)
  -f:指定makefile的名字

export 会让所有子makefile 享用变量 export BUILD_TOP_DIR  :=$(shell pwd)
变量赋值的时候,有冒号的当时就解析,没有冒号的会在用的地方解析, 效果是=号取最后的值,而冒号则是按当前顺序当前的值
OUT_DIR :=$(subst \,/,$(OUT_DIR))
OUT_DIR =$(subst \,/,$(OUT_DIR))


foreach 基本用法
sublibs := $(foreach n,$(SUBCOMPONENTS),$(OUT_DIR)/$(n)/$(n).a)

替换换展名
COBJS = $(SRCC:.c=.o)
COBJS := $(COBJS:.C=.o)

增加前缀 addprefix
COBJS := $(addprefix $(O_DIR)/,$(COBJS))


WIN32 操作系统中要把路径中的 '\' 变成 '/' , 要不问题无穷 (msys 会不认,但又得用win32 路径找文件)
DEP_INC := $(subst \,/,$(DEP_INC))

msys 的路径格式为
/c/work/OK2440/build

gcc 参数中只认msys格式路径
DEP_INC := $(subst C:,/c,$(DEP_INC))


ifneq ($(DEP_INC),)
        DEP_INC := -I$(DEP_INC)
endif


多级文件夹调用
SUBCOMPONENTS += $(blabla)
Make_Sub:
        @for subdir in $(SUBCOMPONENTS); do \
          mkdir -p $(OUT_DIR)/$$subdir;\
          (cd $$subdir && make -f $(MAKEFILE) sub_all O_DIR=$(OUT_DIR)/$$subdir); \
        done;



自动推导
$(O_DIR)/%.o: ./%.c
        @echo compile $< to $@
        $(CC) -c -o $@ $(CFLAG) -I $(INCLUDES) $<  



生成depend,  $< 输入的依赖文件 ,$@为目标文件
gcc 生成depend 格式为 filename.o filename.c includes. 注意不同情况下要对生成结果进行转换,下面是在o前加上$(O_DIR),
echo的 -n 参数会不在行尾生成回车符
$(DEP_DIR)/%.d: %.c  
                @echo Depend: $< to $@
                @echo -n  $(O_DIR)/ > $@
                @$(GCC) $(DEP_OPT) -I$(DEP_INC) $< >> $@


clean 和其它操作不要depend , 传入参数 NODEP=yes
          (cd $$subdir && make -f $(MAKEFILE) sub_clean O_DIR=$(OUT_DIR)/$$subdir NODEP=yes) ; \



包含方式sinclude是兼容unix的-include, 没有文件时不报错, include 会报错停止

ifndef NODEP  
ifneq ($(DEPS),)  
        sinclude $(DEPS)  
endif                 
endif


还是msys 的格式,不认'('和')', 得加转义符
LINKFLAG=-armlib -map -entry __ENTRY -first 2440init.o(Init) -ro-base 0x30010000 -->
LINKFLAG=-armlib -map -entry __ENTRY -first 2440init.o\(Init\) -ro-base 0x30010000




2.1预处理gcc -E test.c -o test.i 或 gcc -E test.c可以输出test.i文件中存放着test.c经预处理之后的代码。打开test.i文件,看一看,就明白了。后面那条指令,是直接在命令行窗口中输出预处理后的代码.gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。在本例中,预处理结果就是将stdio.h 文件中的内容插入到test.c中了。

2.2编译为汇编代码(Compilation)
预处理之后,可直接对生成的test.i文件编译,生成汇编代码:
gcc -S test.i -o test.s
gcc的-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件。


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表