make是调用g ++总是重新编译,即使我不更改源代码

时间:2013-10-19 22:44:53

标签: gcc

我正在使用make调用g ++总是重新编译代码,即使我不更改源代码。对于我的所有项目都会发生这种情况,即使是简单的项目,例如:

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

我认为它应该比较源代码和目标代码的日期/时间。有些人可以帮我这个,我在Ubuntu 12.04上使用GNU工具链运行

THX

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

4 个答案:

答案 0 :(得分:1)

一般来说,g ++必须“重新编译”(如果更改标题而不是main.cpp会发生什么?)

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

答案 1 :(得分:1)

all: main.cpp
    g++ -std=c++11 -c main.cpp

这似乎不对。为什么all的规则将main.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系统的源代码。

答案 2 :(得分:1)

最简单的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 $<

CXX:C ++编译器

CPPFLAGS:C预处理程序标志

CXXFLAGS:C ++编译器标志

$ @:目标

$&lt;:第一依赖

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

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

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

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

答案 3 :(得分: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必须假设它需要重新编译。请参阅上面答案中的示例。