makefiles-CFLAGS

makefiles-CFLAGS,makefile,Makefile,在学习tinyos的过程中,我发现我对makefiles一无所知 有许多可选的编译时特性可以通过声明预处理器变量来使用 要使用它们,您必须执行以下操作: CFLAGS=“-DPACKET\u LINK”这将启用特定功能 及 CFLAGS=“-DPACKET\u LINK”“-DLOW\u POWER”启用两项功能 有人能帮我分析一下这些线,告诉我是怎么回事吗?不是tinyos,而是makefiles 在makefile的某个地方,CFLAG将在编译行中使用,如下所示: $(CC)$(CFLAGS

在学习tinyos的过程中,我发现我对makefiles一无所知

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

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

CFLAGS=“-DPACKET\u LINK”
这将启用特定功能

CFLAGS=“-DPACKET\u LINK”“-DLOW\u POWER”
启用两项功能


有人能帮我分析一下这些线,告诉我是怎么回事吗?不是tinyos,而是makefiles

在makefile的某个地方,CFLAG将在编译行中使用,如下所示:

$(CC)$(CFLAGS)$(C_包括)$CFLAGS是一个最常用于向编译器添加参数的变量。在本例中,它定义宏


因此,
-DPACKET_链接
相当于将
#define PACKET_链接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中),它允许您在命令行而不是某个文件上定义。常见的是-DDEBUG或-DNDEBUG,它们分别激活或禁用调试代码。

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

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

例如


为了完整起见,如果您使用的是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 $<
.c.exe:
命令:$(CC)$(CFLAGS)$<
.c.obj:
命令:$(CC)$(CFLAGS)/c$<
.cpp.exe:
命令:$(CXX)$(CXXFLAGS)$<
.cpp.obj:
命令:$(CXX)$(CXXFLAGS)/c$<

-DPACKET_LINK
相当于
\define PACKET_LINK 1
。如果您想要
#定义数据包链接
,那么您应该使用
-DPACKET\u LINK=
我在gcc文档中检查过,您是正确的@Simon。更新了我的答案
gcc $(CFLAGS) source.c
.c.exe:
    commands:          $(CC) $(CFLAGS) $<

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

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

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