makefiles CFLAGS

时间:2008-09-17 06:58:40

标签: makefile

在学习tinyos的过程中,我发现我对makefile完全无能为力。

有许多可选的编译时功能可以通过声明预处理器变量来使用。

要使用它们,您必须执行以下操作:

CFLAGS="-DPACKET_LINK"这可以启用某项功能。

CFLAGS="-DPACKET_LINK" "-DLOW_POWER"启用了两项功能。

有人可以为我解剖这些行并告诉我发生了什么事吗?不是关于tinyos,而是关于makefile!

6 个答案:

答案 0 :(得分:22)

CFLAGS是一个最常用于向编译器添加参数的变量。在这种情况下,它定义宏。

因此-DPACKET_LINK相当于将#define PACKET_LINK 1放在项目中所有.c和.h文件的顶部。最有可能的是,你的项目中有代码可以查看这些宏是否已定义,并根据具体情况执行:

#ifdef PACKET_LINK
// This code will be ignored if PACKET_LINK is not defined
do_packet_link_stuff();
#endif

#ifdef LOW_POWER
// This code will be ignored if LOW_POWER is not defined    
handle_powersaving_functions();
#endif

如果你在makefile中向下看,你应该看到$(CFLAGS)可能被用作:

$(CC) $(CFLAGS) ...some-more-arguments...

答案 1 :(得分:8)

在makefile中的某个地方,CFLAG将在编译行中使用,如下所示:
$(CC) $(CFLAGS) $(C_INCLUDES) $<

并最终在执行中将被翻译为:

gcc -DPACKET_LINK -DLOW_POWER -c filename.c -o filename.o

此定义将传递给头文件中定义的源代码

答案 2 :(得分:2)

-D选项设置预处理器变量,因此在您的情况下,将编译指定的“#ifdef / #endif”块中的所有代码。

#ifdef PACKET_LINK
/* whatever code here */
#endif

CFLAGS是makefile中使用的变量,在调用编译器时将扩展为它的内容。

E.g。

gcc $(CFLAGS) source.c

答案 3 :(得分:1)

-D代表至少 define (在gcc中),它允许你在命令行#define而不是某处的文件。常见的是-DDEBUG或-DNDEBUG,它们分别激活或禁用调试代码。

答案 4 :(得分:1)

为了完整性 - 如果您使用的是Microsoft的nmake实用程序,您可能实际上看不到makefile中使用的$(CFLAGS)宏,因为nmake对编译C / C ++文件等内容有一些默认值。其中,以下是在nmake中预定义的(我不确定GNU Make是否做了这样的事情),所以你可能在Windows上的工作makefile中看不到它:

.c.exe:
    commands:          $(CC) $(CFLAGS) $<

.c.obj:
    commands:          $(CC) $(CFLAGS) /c $<

.cpp.exe:
    commands:          $(CXX) $(CXXFLAGS) $<

.cpp.obj:
    commands:          $(CXX) $(CXXFLAGS) /c $<

答案 5 :(得分:0)

我发现Ask Mr. Make是Makefile提示的绝佳参考

http://www.cmcrossroads.com/content/category/8/147/268/