我正在使用调用 g++ 的 make 总是重新编译代码,即使我没有更改源代码。这发生在我所有的项目中,即使是简单的项目,例如:
[code]
all: main.cpp
g++ -std=c++11 -c main.cpp
[/code]
我相信它应该比较源代码和目标代码的日期/时间。可以帮我解决这个问题,我在 Ubuntu 12.04 上使用 GNU 工具链运行
谢谢
编辑:对不起,我确实使用 Makefile,我相应地编辑了我的问题。
我正在使用调用 g++ 的 make 总是重新编译代码,即使我没有更改源代码。这发生在我所有的项目中,即使是简单的项目,例如:
[code]
all: main.cpp
g++ -std=c++11 -c main.cpp
[/code]
我相信它应该比较源代码和目标代码的日期/时间。可以帮我解决这个问题,我在 Ubuntu 12.04 上使用 GNU 工具链运行
谢谢
编辑:对不起,我确实使用 Makefile,我相应地编辑了我的问题。
g++ 通常必须“重新编译”(如果您更改标头而不是 main.cpp,会发生什么情况?)
如果您担心构建时间长,您应该使用 Make 之类的东西(专门设计用于避免在源未更改时重新编译)
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 系统的源代码。
已经指出您的 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
文件来构建一个二进制文件。
注意:将文件名直接写入命令是一个坏主意,因为您以后可能会忘记更新它们。
编译器将始终编译代码。如果要进行条件编译(基于文件时间等),则需要使用 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 必须假设它需要重新编译。请参阅上面答案中的示例。