【问题标题】:Defining macro function from makefile从 makefile 定义宏函数
【发布时间】:2015-06-05 03:27:35
【问题描述】:

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

【问题讨论】:

    标签: c++ c makefile macros


    【解决方案1】:

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

    -include "path/to/header.h"
    

    编辑:

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

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

    在 Windows 上它对我有用 " 而不是 '

    【讨论】:

    • 我想知道的 - 有没有办法不包含这种标题?
    • @arbulgazar:您不需要手动将此标头添加到任何文件中。编译器标志-include 会自动为您执行此操作。就好像您所有的源文件都以#include "globally_included_header.h" 开头一样。将您的 dbg_print 定义放在一个文件中可以避免命令 shell 引用地狱。
    • -D'dbg_print(...)=printf(__VA_ARGS__)' 不适用于我的各种```,"'。 :(
    • 我会接受这个答案,因为我实际上正在使用它,但由于某种原因我不喜欢这个-include 解决方案......引号仍然不起作用..
    • @arbulgazar 好吧,我读到了这个here(搜索功能)并仅在Windows 上使用Mingw-w64(带双引号)对其进行了测试——在unix 中必须有一种方法。 ..
    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多