Makefile为源文件提供宏定义

如何在Linux kernel Makefile中添加宏定义

CFLAGS_object.o += -DMACRO_NAME
在编译object.o时定义宏MACRO_NAME,在kernel中添加自己的模块时比较有用。

另外,要想对所以将编译的文件都添加一个宏的定义,可以使用
EXTRA_CFLAGS += -DMY_DEBUG
这样就可以在MY_DEBUG的控制下添加自己的调试信息了。




当使用如下Makefile后警告就没了,说明宏开关起作用了,
Makefile如下:
+++++++++++++++++++++++++++++++++++++++++++
TARGET=test


MYDEF=-DXXX_X__
obj += test.o


test:$(obj)
gcc -o $@ $^ $(MYDEF)


cleanup:
rm -rf *.o $(TARGET)
+++++++++++++++++++++++++++++++++++++++++++


主要是Makefile中-DXXX_X__的作用。
在gcc编译器中, -E是宏替换阶段。同时又制定了-D参数时,会将-D 参数后的字符串最为宏名定义在指定的文件。例如:
-DXXX_X__ <==========> -D XXX_X__ <======> #define  XXX_X__  1
-D XXX_X__=strings < ========= > -DXXX_X__=strings <=========> #define XXX_X__ strings



在一些特别的场合需要把Makefile中定义的变量作为C源代码的初始值.
比如__DATE__宏是C已经预定义的宏,但有时候不喜欢该宏的日期格式,那么可以自己做一个。
 
举例如下:
 
Makefile内容如下:
=================================================
 
STR_A="Hello!"
 
STR_B=$( shell   date   --rfc-3339=date)
 
all:
     gcc    -DSTR_INFO=\"$(STR_A)\"      -DSTR_DATE=\"$(STR_B)\"    -o  test   main.c
 
 
----------------------------------------------------------------------------------------------------------
main.c 内容如下:
==================================================================
#include    <stdlib.h>
#include    <string.h>
#include    <stdio.h>
 
const char  info[]= STR_INFO;         // 这里的宏定义来自Makefile
const char  data[]= STR_DATE;      // 这里的宏定义来自Makefile
 
 
void  main(void)
{
          printf("%s\n", info);
          printf("%s\n", date);
}
posted on 2017-04-10 09:30 我的AR之旅 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/wangchaoqun1997/p/6687541.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
升级版本。与之前版本相比,有如下改动: 1. 在objdir中生成与source相似的目录树,防止不同source目录下同名的源文件生成的obj文件相互覆盖。 2. 在编译过程中,默认显示短命令。可以通过变量设置切换为显示长命令。 3. 用户可自扩展编译规则。 ========================================================== 模板中用到的可配置的变量列表: DEFINES: 定义编译参数,一般用-U或者-D进行宏定义。 EXTRA_CFLAGS: 定义其它的编译参数 inc-y: 头文件搜索目录 src-y: 源文件列表。其中以/结尾的表示目录,其它的表示文件。 SOURCE_SUFFIXES: 源文件后缀名。在src-y指定的目录中搜索以$(SOURCE_SUFFIXES)为后缀的文件,加入到源文件列表中。 例如: src-y = dir1/ dir2/ file9.c SOURCE_SUFFIXES := c cpp 最终形成的源文件列表为: dir1/*.c dir1/*.cpp dir2/*.c dir2/*.cpp file9.c obj-y: 加入连接的obj文件列表。通常这些obj文件不通过源文件编译产生。 ucmd_X: 自定义后缀名为X的源文件的编译规则。 EXCLUDE_FILES: 不参与编译的源文件列表。 OBJECT_DIR:obj文件的输出目录。 LIBS:连接时需要的lib文件。 LDFLAGS:连接参数。 OBJECT_SUFFIX: obj文件的后缀名 DEPEND_SUFFIX: depend文件的后缀名 TARGET: 整个工程最终产生的target文件名。 TARGET_TYPE: $(TARGET)类型。 TARGET_DEPENDS: $(TARGET)的依赖。 CENTRALIZED_SINGLE_DEPEND_FILE: 将所有依赖关系集中生成到同一个depend文件中。默认是每个obj产生一个单独的depend文件。 VERBOSE_COMMAND: 编译过程中显示完整的命令。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值