制作文件CFLAGS

时间:2020-03-05 18:58:08  来源:igfitidea点击:

在学习tinyos的过程中,我发现我对makefile完全一无所知。

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

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

CFLAGS ="-DPACKET_LINK"`启用某些功能。

CFLAGS ="-DPACKET_LINK"" -DLOW_POWER"`启用两个功能。

有人可以帮我剖析这些台词,然后告诉我发生了什么吗?不是关于tinyos,而是关于makefile!

解决方案

回答

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

并最终在执行中将转换为:

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

该定义将被传递到源代码,就像在头文件中定义的那样

回答

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...

回答

-D至少代表define(在gcc中),它使我们可以在命令行上#define而不是某个位置的文件。常见的情况是-DDEBUG或者-DNDEBUG,它们分别激活或者禁用调试代码。

回答

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

IE。

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

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

例如。

gcc $(CFLAGS) source.c

回答

仅出于完整性考虑,如果我们使用的是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 $<

回答

我发现Ask Mr. Make是Makefile提示的不错参考

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