并不意味着必须更新可执行
我写了下面的Makefile:并不意味着必须更新可执行
CC=g++
all: happy
happy: happy.o HappyLetter.o
$(CC) -o happy happy.o HappyLetter.o
happy.o: happy.cpp
$(CC) -c happy.cpp
HappyLetter.o: HappyLetter.cpp
$(CC) -c HappyLetter.cpp
clean:
rm -rf *.o happy
,并正与文件HappyLetter.cpp和happy.cpp(包括原)合作,创建一个名为幸福的可执行文件。
我可以使用make成功构建代码。但是,当我修改HappyLetter.cpp并再次键入“make”时,更改不会反映出来。只有当我输入'make clean'然后'make'时它才起作用。我希望发生的目标文件的更新回显到命令行:
$ make
g++ -c HappyLetter.cpp
g++ -o happy happy.o HappyLetter.o
但是,更新到HappyLetter.cpp没有反映在快乐。
该问题不适用于其他方向。也就是说,如果我修改了happy.cpp,那么在我键入'make'后立即反映更改。
我已经在我的Mac OS X上以及在Ubuntu机器上用三个make二进制文件复制了这个问题。所以我必须在编码方面做错了什么。这里是文件,这些文件在同一目录下生成文件的文本:
happy.cpp
#include "HappyLetter.cpp"
int main()
{
printf("Hello from happy.cpp!\n");
HappyLetter *myObj = new HappyLetter();
myObj->speak();
return 0;
}
HappyLetter.cpp
#include <cstdio>
class HappyLetter {
public:
void speak()
{
printf("Hello from HappyLetter.cpp!\n");
}
};
我相信这个问题是简单的东西,但我对于要检查的内容没有更多的想法。我有一个假设,规则和依赖关系的排序并不重要。
正如我说:
首先,你应该(传统)在不#include "HappyLetter.cpp"
您happy.cpp
(即使是可行的,但可怜的味道)。你应该有一个单独的头文件(与常规include guard)
#ifndef HAPPY_INCLUDED
//// file happy.h
#define HAPPY_INCLUDED
class HappyLetter {
public:
void speak();
};
#endif /*HAPPY_INCLUDED*/
(您可能 - 或者不可─决定,例如在你的happy.h
#include <cstdio>
的class HappyLetter
前,有充分的理由这样做左右逢源! )
那么你应该有一个第一源文件:
// file happy.cpp
#include <cstdio>
#include "happy.h"
int main() {
printf("Hello from happy.cpp!\n");
HappyLetter *myObj = new HappyLetter();
myObj->speak();
delete myObj;
return 0;
}
顺便说一句,你应该使用smart pointers!
然后你有你的第二个源文件:
// file happyletter.cpp
#include <cstdio>
#include "happy.h"
void HappyLetter::speak() {
printf("Hello from HappyLetter.cpp!\n");
}
最后一个Makefile
(见here灵感),如:
# file Makefile
CXX= g++
CXXFLAGS= -std=c++11 -Wall -Wextra -g
RM= rm -f
.PHONY: all clean
all: happy-prog
clean:
$(RM) *.o *~ happy-prog
happy-prog: happy.o happyletter.o
happy.o: happy.cpp happy.h
happyletter.o: happyletter.cpp happy.h
通知明确依赖于happy.h
头
正如我评论,考虑使用remake
-x
或make --trace
来调试您的Makefile
。请注意,GNU make有很多内置规则,运行make -p
来获取它们。
了解更多关于C++11,引人注目的是tutorial,良好的programming in C++书,有一目了然到标准(例如n3337草案)。另请阅读有关make,特别是GNU make。
研究用C++编码的一些现有的free software的源代码(见sourceforge或github等等找到一个)。
(所以你有你的两个C++源文件和Makefile
错了!)
使用[重拍](http://bashdb.sourceforge.net/remake/)'-x'或'让 - -trace';还可以像[这里](http://*.com/a/20146082/841108)一样改进你的'Makefile';在重新运行'make'之前尝试'触摸HappyLetter.cpp'' – 2015-01-26 20:21:48
在'happy.cpp'附近开始时,你不应该*'#include“HappyLetter.cpp”';你应该有一个'happy.h'头文件,在'HappyLetter.cpp'和'happy.cpp'中都有'#include“happy.h”'并且修改你的'Makefile' – 2015-01-26 20:27:14