【问题标题】:Turning commands into a Makefile将命令转换为 Makefile
【发布时间】:2012-04-10 16:32:05
【问题描述】:

我一直在阅读 Makefile,但我仍然不知道如何将以下命令写入 Makefile。

gcc -std=c89 A.c -c
gcc -std=c89 B.c -c
gcc -std=c89 C.c -c
gcc -std=c89 A.o B.o -o A
gcc -std=c89 C.o B.o -o C

A 和 C 依赖于 B,但它们是独立的程序。

这是我想出来的,但不起作用:

CC = gcc -std=c89
FILES = A.c B.c C.c
OUT = out
build: $(FILES)
    $(CC) -o $(OUT) $(Files)
clean:
    rm -f *.o core

【问题讨论】:

    标签: c gcc makefile


    【解决方案1】:

    这是一个没有噱头的makefile,在gcc和rm之前的必须是'tab'字符,它们不是空格。

    all: A C
    
    A.o: A.c
        gcc -std=c89 -c A.c
    
    B.o: B.c
        gcc -std=c89 -c B.c
    
    C.o: C.c
        gcc -std=c89 -c C.c
    
    A: A.o B.o
        gcc -std=c89 -o A A.o B.o
    
    C: C.o B.o
        gcc -std=c89 -o C C.o B.o
    
    clean:
        rm A C a.o b.o c.o core
    

    【讨论】:

      【解决方案2】:

      试试这个:

      X1 = A
      O1 = A.o B.o
      
      X2 = B
      O2 = C.o B.o
      
      DBGFLAGS = -g -O0
      CFLAGS = -W -Wall $(DBGFLAGS)
      
      all: $(X1) $(X2) 
      
      $(X1): $(O1)
              $(CC) $(LDFLAGS) -o $@ $(O1) $(LIBS)
      
      $(X2): $(O2)
              $(CC) $(LDFLAGS) -o $@ $(O2) $(LIBS)
      
      .PHONY: clean
      
      clean:
              rm -f $(X1) $(O1) $(X2) $(O2) *~
      

      如果复制粘贴不行,把8个空格换成一个tab。

      【讨论】:

        【解决方案3】:

        当您编写一个 makefile 时,您通常从头开始,然后朝着开头工作。您从最终产品开始,并给出如何从起点开始生产的规则。

        在这种情况下,您似乎有两个最终产品:AC

        all: A C
        

        如果您没有在命令行上指定目标,make 将构建它在 makefile 中看到的第一个目标。因此,您希望它作为文件中的第一个目标,其他目标在其下方。如果你把它想象成一棵树,这就是树的根,下面的每一项都是那棵树的一个分支。

        还可以定义包含在此根目录下的次要目标。举例来说,许多(大多数?)makefile 包含一个名为clean 的目标,该目标会删除将在构建过程中创建的所有中间文件。这将在用户调用make clean 时使用,而不是作为仅作为命令发出make 的一部分。

        无论如何,然后你告诉它每个依赖什么,以及如何从它依赖的内容创建它:

        A: A.o B.o
            $(CC) -o A A.o B.o
        
        C: B.o C.o
            $(CC) -o B B.o C.o
        

        然后(如果有必要 - 它不在这里)你会告诉它每个 .o 文件如何依赖于 .c 文件。然而,Gmake(就像几乎曾经存在的 make 工具一样)具有内置规则来告诉它如何编译 C 或 C++ 文件以生成匹配的目标文件。这些将类似于您的 makefile 在顶部包含类似这样的内容:

        CC = gcc
        
        .c.o:
            $(CC) $(CFLAGS) -c $*.c
        

        这会将 CFLAGS 的当前值作为标志传递给编译器,因此您希望将其设置为您需要的标志——在您的情况下:

        CFLAGS = -std=c89
        

        您通常希望将其放在 makefile 的顶部,通常位于任何目标之前。

        我应该补充一点,这甚至无法涵盖您可以在 makefile 中执行的所有操作。 很多快捷方式在您处理大量文件时非常方便,但在您只有三个源文件时就不是很有用了。

        【讨论】:

        • (错别字,应该是C: C.o B.o
        • @Beta:糟糕。谢谢你。固定。
        【解决方案4】:

        假设您使用GNU make,您可以主要依赖内置规则:

        CFLAGS = -std=c89
        LDFLAGS = -std=c89
        A: A.o B.o
        C: C.o B.o
        

        这将执行您列出的命令。但是,它不关心清洁或类似的东西。不过,您不一定需要这样做 - make 程序会注意到何时需要重新编译/重新链接并自动执行此操作。

        【讨论】:

        • 我收到此错误:'ake: Fatal error: Don't know how to make target `B.o
        • 添加:%.o: %.c[ENTER][TAB]gcc -o $@ $< 某处 :-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 2021-07-25
        • 2011-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多