【问题标题】:Set debugging macro conditionally with make使用 make 有条件地设置调试宏
【发布时间】:2009-09-17 18:13:53
【问题描述】:

在我的 C++ 项目中,我有一个约定,每当定义宏 DEBUG 时,调试 printf-esque 语句都会编译到可执行文件中。

为了表明我是否希望将这些编译到可执行文件中,我通常会使用 -Dmacro 选项将宏名称传递给 gcc。所以,在Makefile我(目前)有:

CXXFLAGS += -g -I ../ -Wall -Werror -DDEBUG

但是,这不是很灵活;如果我不想在最终程序中使用调试语句,则必须修改 Makefile 以删除 -DDEBUG。

有没有办法修改Makefile,这样我可以通过传入另一个目标名称或命令行开关有条件地选择是否在编译时使用 CXXFLAGS 中的 -D 进行编译?不知道我是怎么做的。

【问题讨论】:

    标签: c++ build debugging makefile macros


    【解决方案1】:

    您可以根据makefile中的目标有条件地定义其他变量。

    all:    target
    debug:  target
    
    debug:  DEBUG=PLOP
    
    target:
            @echo "HI $(DEBUG)"
    

    那么现在:

    > make
    HI
    >
    > make debug
    HI PLOP
    >
    

    【讨论】:

      【解决方案2】:

      附加另一个您可以从 CLI 或环境中设置的变量

      $ cat Makefile
      CXXFLAGS += $(CLIFLAGS)
      
      maintarget:
          echo $(CXXFLAGS)
      $ make CLIFLAGS=-DDEBUG
      echo -DDEBUG
      -DDEBUG
      $ 
      

      【讨论】:

        【解决方案3】:
        【解决方案4】:

        在沉思 make documentation 之后,我尝试将其放入我的 Makefile 中:

        ifneq(,$(findstring d,$(MAKEFLAGS)))
        CXXFLAGS += <... all normal options ...> -DDEBUG
        else
        CXXFLAGS += <... all normal options ...>
        endif
        

        然后,当你运行make -d 时,-DDEBUG 被设置。

        现在,请注意,它有效,但我必须使用 make 通常接受的普通标志(你不能自己编)。使用 -d 还会向屏幕显示(无害的)冗长的 make 级调试语句。我真的不想要;它掩盖了编译错误。但它确实有效。

        我希望有人能想出一个更好的主意。

        【讨论】:

        • Amro 的链接对这个想法有一个变体,比我的要好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多