1

我正在使用调用 g++ 的 make 总是重新编译代码,即使我没有更改源代码。这发生在我所有的项目中,即使是简单的项目,例如:

    [code]
    all: main.cpp
        g++ -std=c++11 -c main.cpp
    [/code]

我相信它应该比较源代码和目标代码的日期/时间。可以帮我解决这个问题,我在 Ubuntu 12.04 上使用 GNU 工具链运行

谢谢

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

4

4 回答 4

1

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

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

于 2013-10-19T22:49:00.783 回答
1
all: main.cpp
    g++ -std=c++11 -c main.cpp

这似乎是错误的。为什么以allmain.cpp 为目标的规则?不应该是something.exe还是something.o?说

all: main.exe

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

clean:
    del main.exe

目标是输出文件,cpp 文件是应该输入到 make 系统的源代码。

于 2013-10-20T07:07:02.190 回答
1

最简单的 Makefile

已经指出您的 Makefile 可能是错误的。'all' 目标确实总是被构建的(尽管如果它没有命令并且所有依赖项都已经满足,它可能会导致无操作)。您在 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 $<

CXX:C++ 编译器

CPPFLAGS:C 预处理器标志

CXXFLAGS:C++ 编译器标志

$@:目标

$<: 第一个依赖

如果您不想使用标准变量或模式匹配,则可以显式构建整个 makefile:

all: main
main: main.o
    gcc -o $@ $^
main.o: main.c
    gcc -g -Wall -Werror -o $@ -c $<

$^:如果您想包含所有依赖项,请使用那个,例如,如果您有多个*.o文件来构建一个二进制文件。

注意:将文件名直接写入命令是一个坏主意,因为您以后可能会忘记更新它们。

于 2013-10-20T08:03:03.953 回答
0

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

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

myapp.exe: main.o file1.o file2.o
    g++ -o myapp.exe main.o file1.o file2.o

(make 知道使用 .cpp 文件来构建 .o 文件)

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

- - 编辑 - -

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

于 2013-10-19T22:48:42.857 回答