【问题标题】:GNU Make Including source files from target-specific variablesGNU Make 包括来自目标特定变量的源文件
【发布时间】:2012-02-29 16:50:12
【问题描述】:

我尝试通过make prog1make prog2 使用一个GNU Makefile 构建两个程序。我尝试使用特定于目标的变量来指定目标专有但 test1.c 或 test2.c 已构建的源文件。它们仅在链接可执行文件时被引用。如何让 Makefile 编译 test1.c 或 test2.c?

以下是我的 Makefile 的摘录:

...
prog1: PASRC = test1.c
prog2: PASRC = test2.c
...
ASRC = $(PASRC) common.c
...
OBJS = $(ASRC:.c=.o)
...
prog1: $(OBJS) prog1.elf
prog2: $(OBJS) prog2.elf
...
%elf: $(OBJS)
    $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $@

提前感谢您的帮助

【问题讨论】:

    标签: makefile gnu gnu-make


    【解决方案1】:

    无需使用特定于目标的变量。常规依赖就足够了:

    all : prog1 prog2 # default target
    
    prog1 : test1.o 
    prog2 : test2.o 
    prog1 prog2 : common.o
    
    %.o : %.c # how to build any .o from a corresponding .c
        $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $< 
    
    prog1 prog2 : % : 
        $(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@
    

    【讨论】:

      【解决方案2】:

      除非您有某种未说明的特定要求,否则我建议让 make 为您完成工作(默认规则和标志)。

      PROGS = prog1 prog2
      COMMON_OBJS = common.o
      
      all: $(PROGS)
      prog1 prog2: % : %.o $(COMMON_OBJS)
      
      clean:
              rm -f $(PROGS) $(PROGS:%=%.o) $(COMMON_OBJS)
      

      您仍然可以设置 CLFAGS、LDFLAGS 等(在命令行或 makefile 中),默认规则会选择它们。

      如果您使用的是 GNU make,您可以通过运行查看所有生成的自动规则:

      make -n -p
      

      这是很多输出,所以我建议将它传送到您选择的寻呼机。

      【讨论】:

        猜你喜欢
        • 2014-04-11
        • 2020-08-22
        • 2011-03-05
        • 1970-01-01
        • 2013-12-19
        • 1970-01-01
        • 1970-01-01
        • 2013-02-18
        • 2021-07-23
        相关资源
        最近更新 更多