从makefile定义宏函数

时间:2015-06-04 18:24:47

标签: c++ c makefile macros

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

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

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

#define MY_DEBUG 2

可用于所有项目文件。

问题:我是否可以通过这种方式在整个项目中定义宏功能,而不包含某种带-include的头文件或其他方式?< / p>

我的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

2 个答案:

答案 0 :(得分:4)

您可以将命令行中的标题插入到所有源中,方法是将其添加到CXX标记:

-include "path/to/header.h"

修改

在您的特定情况下,您还可以将其传递给CXX标志以创建宏功能:

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

在Windows上,"而不是'

对我有用

答案 1 :(得分:1)

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

只需将调试功能放在一个由#ifdef保护的文件中,并在make命令中指定调试标志和文件。

总结:

在Makefile中

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

在global_included_header.h

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