代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

MaFoCH不建立程序的最新部分-C++

  •  1
  • Navaneeth K N  · 技术社区  · 16 年前

    我刚开始做文件,并面临一些问题。我创建了以下makefile。它工作正常。但是当我修改 主CPP 并运行 制作 它说 “一切都是最新的” . 我需要做一个 使清洁 再跑一次,一切都会好起来的。

    看起来这个makefile有点问题,我不知道哪里出错了。有人能帮我找出这个makefile中的错误在哪里,以及为什么不构建更改过的文件吗?

    #Main makefile which does the build
    
    CFLAGS =
    CC = g++
    PROG = fooexe
    
    #each module will append the source files to here
    SRC :=
    
    #including the description
    include foo/module.mk
    
    OBJ := $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC))) main.o
    
    #linking the program
    fooexe: $(OBJ)
        $(CC) -o $(PROG) $(OBJ)
    
    %.o:
        $(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC)))
    
    main.o:
        $(CC) -c main.cpp
    
    depend:
        makedepend -- $(CFLAGS) -- $(SRC)
    
    .PHONY:clean
    clean:
        find . -name "*.o" | xargs rm -vf
        rm -vf fooexe
    
    4 回复  |  直到 16 年前
        1
  •  5
  •   Andy White    16 年前

    通常.o文件需要依赖于相应的.cpp文件。我认为这是语法,但不是100%确定:

    %.o : %.cpp
        $(CC) ...
    
    main.o : main.cpp
        $(CC) ...
    
        2
  •  5
  •   bk1e    16 年前
    %.o:
        $(CC) -c $(SRC) -o $(patsubst %.cpp, %.o, $(filter %.cpp,$(SRC)))
    

    这是一个模式规则,告诉make,“每当 .o 文件是必需的,不存在,请运行 $(CC) 在所有的 .cpp 文件在 $(SRC) “它不重新编译 CPP 文件更改时,因为它没有列出任何先决条件。如果需要 o 文件已经存在,则没有理由让Make执行 美元(CC) 命令。

    如果你把第一行改成 %.o: %.cpp 正如安迪·怀特建议的那样,更新后的规则现在告诉make,“每当需要一个.o文件,而该文件不存在或比相应的文件旧时, CPP 文件,运行 美元(CC) 在所有的 CPP 文件在 $(SRC) ."

    这更好,但仍然有一个问题:更新后的规则总是编译 CPP 文件,甚至是最新的文件。要解决此问题,规则的命令部分需要重新编译正确的 CPP 归档到正确的 o 文件。您可以使用自动变量(如 $< (第一个先决条件)和 $@ (目标):

    %.o: %.cpp
        $(CC) -c $< -o $@
    

    这个 GNU Make Manual 有更多的解释和细节。

        3
  •  1
  •   Chris Erickson    16 年前

    使用main.cpp--main.o-的规则没有为main.o指定任何依赖项。您至少需要该行是“main.o:main.cpp”,以及main.o所依赖的任何其他源文件。

    我看到你有一个使用makedependy的依赖规则;你使用它正确吗?我自己没用过它,但我总是在生成文件的结尾加上如下内容:

    depend:
        mv Makefile Makefile.bak
        sed '/^#DO NOT DELETE THIS LINE$$/,$$d' Makefile.bak > Makefile
        echo '#DO NOT DELETE THIS LINE' >> Makefile
        echo '#' >> Makefile
        $(CC) -MM *.c >> Makefile
    
    #
    #DO NOT DELETE THIS LINE
    #

    然后,当我运行“make dependy”时,我得到如下行:

    main.o: main.c main.h otherstuff.h
    otherstuff.o: otherstuff.c otherstuff.h
        4
  •  0
  •   Charlie Martin    16 年前

    在打开调试的情况下运行make并查看获得的结果。

    make是一个非常古老的代码,它非常确定它在做它认为你想做的事情。

    您使用find查找.o文件的事实使我认为您在实际文件中具有子目录;如果是这样,您需要确保确保可以看到它们。