生成文件 CFLAGS

发布于 2024-07-05 13:51:37 字数 377 浏览 4 评论 0原文

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

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

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

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

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

有人可以帮我剖析这些线条并告诉我发生了什么事吗? 不是在 TinyOS 方面,而是在 makefile 方面!

In the process of learning TinyOS I have discovered that I am totally clueless about makefiles.

There are many optional compile time features that can be used by way of declaring preprocessor variables.

To use them you have to do things like:

CFLAGS="-DPACKET_LINK" this enables a certain feature.

and

CFLAGS="-DPACKET_LINK" "-DLOW_POWER" enables two features.

Can someone dissect these lines for me and tell me whats going on? Not in terms of TinyOS, but in terms of makefiles!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

少跟Wǒ拽 2024-07-12 13:51:37

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

.c.exe:
    commands:          $(CC) $(CFLAGS) 
lt;

.c.obj:
    commands:          $(CC) $(CFLAGS) /c 
lt;

.cpp.exe:
    commands:          $(CXX) $(CXXFLAGS) 
lt;

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

Just for completeness in this - if you're using Microsoft's nmake utility, you might not actually see the $(CFLAGS) macro used in the makefile because nmake has some defaults for things like compiling C/C++ files. Among others, the following are pre-defined in nmake (I'm not sure if GNU Make does anything like this), so you might not see it in a working makefile on Windows:

.c.exe:
    commands:          $(CC) $(CFLAGS) 
lt;

.c.obj:
    commands:          $(CC) $(CFLAGS) /c 
lt;

.cpp.exe:
    commands:          $(CXX) $(CXXFLAGS) 
lt;

.cpp.obj:
    commands:          $(CXX) $(CXXFLAGS) /c 
lt;
盛夏已如深秋| 2024-07-12 13:51:37

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

CFLAGS is a variable that is most commonly used to add arguments to the compiler. In this case, it define macros.

So the -DPACKET_LINK is the equivalent of putting #define PACKET_LINK 1 at the top of all .c and .h files in your project. Most likely, you have code inside your project that looks if these macros are defined and does something depending on that:

#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

If you look further down in your makefile, you should see that $(CFLAGS) is probably used like:

$(CC) $(CFLAGS) ...some-more-arguments...
述情 2024-07-12 13:51:37

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

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

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

这个定义将被传递到源代码,因为它是在头文件中定义的

Somewhere in the makefile the CFLAG will be used in compilation line like this:
$(CC) $(CFLAGS) $(C_INCLUDES) $<

and eventually in the execution will be translated to :

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

This define will be passed to the source code as it was define in the header file

堇年纸鸢 2024-07-12 13:51:37

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

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

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

例如

gcc $(CFLAGS) source.c

The -D option set pre-processor variables, so in your case, all code that is in the specified "#ifdef / #endif" blocks will be compiled.

I.e.

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

The CFLAGS is a variable used in the makefile which will be expanded to it's contents when the compiler is invoked.

E.g.

gcc $(CFLAGS) source.c
战皆罪 2024-07-12 13:51:37

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

-D stands for define (in gcc) at least, which lets you #define on the command line instead of a file somewhere. A common thing to see would be -DDEBUG or -DNDEBUG which respectively activate or disable debugging code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文