【问题标题】:Compiling with different flags in Makefile?在 Makefile 中使用不同的标志进行编译?
【发布时间】:2011-04-27 05:05:52
【问题描述】:

我有一个用于与操纵杆交互的程序。它使用条件编译来指定特定的操纵杆。我们现在只需将正确的标志硬编码到 Makefile 中即可。

我想制作它,以便它根据提供给 Makefile 的命令使用不同的标志。例如,我目前有这个:

.PHONY: saitek
saitek: $(SOURCES)
    $(COMPILE) -DSAITEK
.PHONY: logitech
logitech: $(SOURCES)
    $(COMPILE) -DLOGITECH

我希望只运行这些命令中的一个,并且我希望它们都生成相同的可执行文件。但是如果我重新运行'make',它会再次编译程序。我希望它认识到它已经构建了程序。

有没有办法用 Makefile 做这个?

【问题讨论】:

    标签: makefile


    【解决方案1】:

    如果您使用的是 GNUMake,这将满足您的要求。它根据给予 Make 的命令使用不同的标志,并且不会不必要地重新构建程序。

    .PHONY: saitek logitech
    saitek: JOYSTICK=SAITEK
    logitech: JOYSTICK=LOGITECH
    
    # Suppose the actual name of your executable is "program"
    
    saitek logitech: program
    
    program: $(SOURCES)
        $(COMPILE) -D$(JOYSTICK)
    

    【讨论】:

      【解决方案2】:

      GNU make inherits variables from its environment,所以如果你指定

      $ JOYSICK=LOGITECH
      

      在你的外壳中,并使用

      CFLAGS+=-D$(JOYSTICK)
      

      在你的 makefile 中。

      【讨论】:

        【解决方案3】:

        我质疑这样做的必要性。您可以将make 称为make CFLAGS=-DSAITEK 或使用autoconf 并替换为正确的定义。

        也就是说,这样的事情怎么样:

        saitek logitech: program
        .PHONY: saitek logitech
        
        ifeq ($(MAKECMDGOALS),saitek)
        CFLAGS += -DSAITEK
        endif
        ifeq ($(MAKECMDGOALS),logitech)
        CFLAGS += -DLOGITECH
        endif
        
        program: $(OBJS)
        # Whatever
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-28
          • 1970-01-01
          • 2021-12-10
          • 1970-01-01
          相关资源
          最近更新 更多