c++ - 了解 Makefile 的依赖关系 (C++)

标签 c++ c++11 makefile dependencies conceptual

在处理 C++ 项目时,我注意到我正在对链接到我的主代码中的一个头文件进行更改,但是 make 实用程序没有注册它。鉴于使用“make - B”进行的更改,我不得不强制它进行不同的编译。

我想知道为什么会这样;是因为我的 makefile 是如何编写的,我的文件如何相互依赖,两者都依赖,还是两者都不依赖?

这是我的生成文件:

CXXFLAGS = -Wall -Werror -std=c++11 -pedantic -Wvla -g
//CXXFLAGS = -std=c++11

all:    main.o game.o zombie.o
        g++ $(FLAGS)  game.o main.o zombie.o -o main $(CXXFLAGS)

game:   game.cpp 
        g++ $(FLAGS) -c game.cpp $(CXXFLAGS)

zombie: zombie.cpp
        g++ $(FLAGS) -c zombie.cpp $(CXXFLAGS)

main:   main.cpp
        g++ $(FLAGS) -c main.cpp pairing_heap.h $(CXXFLAGS)

我更改了 pairing_heap.h
,它在我的主文件中#included。

为什么 make 没有注意到它应该再次编译?因为我觉得这是一个概念上的误解,所以我觉得没有必要包括我所做的更改或我做“make - B”时的输出差异。它们是简单的东西,例如新的 pairing_heap.h 中包含的 cout 和 cerr,直到被强制才被拾取。

如果我需要提供更多信息,请告诉我。

谢谢。

最佳答案

您在 main 的配方中列出了 pairing_heap.h,这不会使其成为 main 的依赖项(此外,您应该永远不要像这样将 header 传递给编译器),为此您需要按如下方式编写规则:

main:   main.cpp pairing_heap.h 
        g++ $(FLAGS) -c main.cpp $(CXXFLAGS)

您的文件中还有许多其他不正确的地方,例如您的目标不是实际文件(main: 应该是 main.o: 等),并且您没有使用自动变量或模式规则,但将所有内容替换为以下内容可能更容易

CPPFLAGS := -MMD -MP
CXXFLAGS := -Wall -Werror -std=c++11 -pedantic -Wvla -g
SOURCES  := $(wildcard *.cpp)

main: $(SOURCES:.cpp=.o)

-include $(SOURCES:.cpp=.d)

利用 make 的 implicit rules和 gcc/clang 的自动依赖生成来生成一个名为 main 的可执行文件。

关于c++ - 了解 Makefile 的依赖关系 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28425130/

相关文章:

c++ - 在调用基类构造函数之前初始化派生类成员变量。这是UB吗?

c++ - std::regex_replace 替换 n 次出现并获取替换次数

c++ - 使用正则表达式检测表达式中的术语

makefile - 使用 -fPIC 重新编译

makefile - ifeq : syntax error near unexpected token 出错

java - 如何使用 JNI 将 Java 中的 ArrayList<Integer> 转换为 C++ int 数组?

android - 将图像从 ios/c++ 代码传递到 JNI Android

c++ - MAC OSX 狮子 : gcc on mac not compiling wget

c++ - 我可以使用迭代器访问优先级队列的元素吗?

c - 通过 Makefile 构建并构建脚本有效,但等效的 Makefile.am 没有。(给出 undefined reference 错误)