假设我的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
答案 0 :(得分:4)
您可以将命令行中的标题插入到所有源中,方法是将其添加到CXX标记:
-include "path/to/header.h"
修改强>
在您的特定情况下,您还可以将其传递给CXX
标志以创建宏功能:
-D'dbg_print(...)=printf(__VA_ARGS__)'
在Windows上,"
而不是'
答案 1 :(得分:1)
您可以将此标头包含在gcc -include
或cl -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