从makefile定义宏函数

Defining macro function from makefile

本文关键字:函数 定义 makefile      更新时间:2023-10-16

假设我的makefile中有以下条目:

ifeq ($(MY_DEBUG),yes) 
EXTRACXXFLAGS += -DMY_DEBUG=2
endif

我用make foo MY_DEBUG=yes调用它现在我基本上有

#define MY_DEBUG 2

所有可用的项目文件。

问题:我可以在整个项目中以这种方式定义宏函数,而不包括-include或其他方式的某种头文件吗?

我需要的是这样的东西在我的makefile:

/* not working code */
ifeq ($(MY_DEBUG),yes) 
EXTRACXXFLAGS += -Ddbg_print(...)=printf(##__VA_ARGS__)
endif

通常我会在一些头文件中定义这个宏函数,包括在整个项目中,但是这个特殊的项目太大了,没有这样的头文件。


如果一个头文件包含在所有地方,这是一种方法:

Makefile

# this is in makefile
ifeq ($(MY_DEBUG),yes) 
EXTRACXXFLAGS += -DMY_DEBUG
endif

globally_included_header.h

// header, included all over the project
#ifdef MY_DEBUG
#    define dbg_print(...) printf(##__VA_ARGS__)
#else
#    define dbg_print(...)
#endif

您可以通过将此添加到CXX标志中来从命令行插入标题到所有源:

-include "path/to/header.h"
编辑:

在你的特殊情况下,你也可以把它传递给CXX标志来创建一个宏函数:

-D'dbg_print(...)=printf(__VA_ARGS__)'

在windows上,它适用于"而不是'

您可以在gcc -includecl -FI (Windows Visual Studio)的所有源文件中包含这样的头文件。

把你的调试函数放在一个文件中,由#ifdef保护,并在make命令中指定调试标志和文件。

总结:

在Makefile

ifeq ($(MY_DEBUG),yes) 
EXTRACXXFLAGS += -DMY_DEBUG
endif
...
    $(CC) $(EXTRACXXFLAGS) -include globally_included_header.h ...

globally_included_header.h

// header, included all over the project
#ifdef MY_DEBUG
#    define dbg_print(...) printf(##__VA_ARGS__)
#else
#    define dbg_print(...)
#endif