Gcc make正在调用g++;即使在我不更改源代码的情况下,也总是重新编译

Gcc make正在调用g++;即使在我不更改源代码的情况下,也总是重新编译,gcc,Gcc,我使用make调用g++总是重新编译代码,即使我不更改源代码。这适用于我的所有项目,即使是简单的项目,例如: [code] all: main.cpp g++ -std=c++11 -c main.cpp [/code] 我认为它应该比较源代码和目标代码上的日期/时间。我正在Ubuntu 12.04上使用GNU工具链运行 THX 编辑:对不起,伙计们,我确实使用Makefile,我相应地编辑了我的问题。编译器将始终编译代码。如果要进行条件编译(基于文件时

我使用make调用g++总是重新编译代码,即使我不更改源代码。这适用于我的所有项目,即使是简单的项目,例如:

    [code]
    all: main.cpp
        g++ -std=c++11 -c main.cpp
    [/code]
我认为它应该比较源代码和目标代码上的日期/时间。我正在Ubuntu 12.04上使用GNU工具链运行

THX


编辑:对不起,伙计们,我确实使用Makefile,我相应地编辑了我的问题。

编译器将始终编译代码。如果要进行条件编译(基于文件时间等),则需要使用make、CMake、Ant等make系统。最简单的方法是在目录中设置一个小的“Makefile”,并使用命令“make”进行编译

用于从“main.cpp”、“file1.cpp”和“file2.cpp”编译“myapp.exe”的简单Makefile

(了解如何使用.cpp文件生成.o文件)

但是如果你也有头文件,那么你需要建立依赖链,你可能想研究一些更复杂的东西,比如automake、cmake、ant等等

----编辑----

根据您更新的帖子,问题在于您没有指定目标,因此Make必须假设它需要重新编译。请参阅上面答案中的示例。

g++通常必须“重新编译”(如果更改标头而不是main.cpp会发生什么情况?)

如果您担心构建时间过长,那么应该使用Make之类的工具(专门设计用于在源代码未更改时避免重新编译)

这似乎是错误的。为什么
all
的规则将main.cpp作为其目标?它不应该是某个.exe或某个.o吗?说

all: main.exe

main.exe: main.cpp
    g++ -std=c++11 main.cpp -o main.exe

clean:
    del main.exe
目标是输出文件,cpp文件是应输入到make系统的源代码。

Simplest Makefile 已经指出您的Makefile可能是错误的。“all”目标确实始终是构建的(尽管如果它没有命令且所有依赖项都已满足,则可能会导致no-op)。makefile中所需的全部内容如下:

all: main
对象文件 如果你希望在你的构建中有更多的源文件,你应该考虑创建中间对象文件:

all: main
main: main.o
调整构建 Make将自动找到
main.ccp
文件,并将其转换为上述指令要求的
main
。您可以使用特殊的make变量进一步调整编译,例如用于包含调试信息和警告配置:

CXXFLAGS = -g -Wall -Werror

all: main
main: main.o
挑剔 如果您坚持自己建立编译规则,您可以这样做:

%.o: %.hpp
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
%.o:%.hpp
$(CXX)$(CPPFLAGS)$(CXXFLAGS)-o$@-c$<

CX:C++编译器

CPPFLAGS:C预处理器标志

CXXFLAG:C++编译器标志< /P> $@:目标


$I do use make file,很抱歉造成混淆,我编辑了我的问题。编辑了答案:问题是您使用“all”作为目标,而没有指定输出目标。因此,Make没有什么可检查的。现在修复它。谢谢<代码>所有目标确实总是错误的。第二次运行
make
给出了
make:all'无需做任何事
@legends2k我认为这实际上并没有错,但我改进了措辞。它被处理,它的所有依赖项都被处理,它的所有命令都被运行(在这种情况下没有)。请随意提出更好的措辞。在本例中:%.o:%.hpp$(CXX)$(CPPFLAGS)$(CXXFLAGS)-o$@-c$如果只编译,为什么会有-o选项?另外,您是否可以扩展此示例,使其也是构建可执行的。谢谢你的详尽答复。
CXXFLAGS = -g -Wall -Werror

all: main
main: main.o
%.o: %.hpp
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
all: main
main: main.o
    gcc -o $@ $^
main.o: main.c
    gcc -g -Wall -Werror -o $@ -c $<