【问题标题】:Writing a makefile for an project with some arranged folders为具有一些排列文件夹的项目编写生成文件
【发布时间】:2012-02-28 16:53:04
【问题描述】:

我有下面的makefile和一个目录树:

->project/src/main.c, func.c, 生成文件

->项目/exe/

->项目/公司/

->项目/obj/

  cc=gcc
    cflags=-c
    obj=../obj
    exe=../exe
    inc=../inc
    prog.exe: main.o func.o
        $(cc) main.o func.o -o $(exe)/prog.exe
    main.o: main.c $(inc)/defs.h
        $(cc) $(cflags) main.c
        mv main.o $(obj)/
    func.o: func.c $(inc)/defs.h
        $(cc) $(cflags) func.c
        mv func.o $(obj)/

问题是,main.o 和 func.o(以 mv 开头)下面的第二个操作不起作用(即 main.o 没有移动到 /obj 目录)。 makefile的语法有问题吗?

【问题讨论】:

  • “不起作用”:请更准确地描述问题。没有电池的 Energizer Bunny 和 Challenger 宇宙飞船都“不起作用”,但方式截然不同。
  • 使用 CC、CFLAGS 等(全部大写)是一个长期惯例。这些使用隐式规则,因此在许多情况下您甚至不需要指定规则。通过使用不同的名称来炫耀惯例是不明智的。
  • @WilliamPursell 这只是一次天真的尝试

标签: linux makefile


【解决方案1】:

一个明显的问题是makefile 没有构建它应该构建的目标。即:

prog.exe: main.o func.o
    $(cc) main.o func.o -o $(exe)/prog.exe

不构建prog.exe,而是构建$(exe)/prog.exe,这是一个不同的文件。解决方法是:

$(exe)/prog.exe: $(obj)/main.o $(obj)/func.o
    $(cc) $^ -o $@

最好使用automatic variables 作为输入和输出文件的名称,以避免重复和愚蠢的拼写错误。

【讨论】:

  • 是的,但它没有解决我的问题。 main.o 无法移动。
  • 不,是因为你注意到的明显问题
【解决方案2】:

您可以使用 make 处理缩进。它需要真正的标签。

https://superuser.com/questions/224434/what-is-the-character-used-to-indent-the-make-file-rule-recipe

【讨论】:

  • main.o:main.c $(inc)/defs.h $(cc) $(cflags) main.c mv main.o $(obj )/ 还是有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
相关资源
最近更新 更多