我正在使用make调用g ++总是重新编译代码,即使我不更改源代码。对于我的所有项目都会发生这种情况,即使是简单的项目,例如:
[code]
all: main.cpp
g++ -std=c++11 -c main.cpp
[/code]
我认为它应该比较源代码和目标代码的日期/时间。有些人可以帮我这个,我在Ubuntu 12.04上使用GNU工具链运行
THX
编辑:对不起伙计们,我确实使用了Makefile,我相应地编辑了我的问题。
答案 0 :(得分:1)
如果您担心漫长的构建时间,您应该使用像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可能是错误的。确实总是构建'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必须假设它需要重新编译。请参阅上面答案中的示例。