我写了以下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(包括前者)来创建名为happy的可执行文件。
我可以使用make成功构建代码。但是,当我修改HappyLetter.cpp并输入' make'再次,这种变化没有反映出来。它只适用于我打字“干净”的时候。然后'制作'。我期望发生的目标文件的更新将回显到命令行:
$ make
g++ -c HappyLetter.cpp
g++ -o happy happy.o HappyLetter.o
然而,HappyLetter.cpp的更新并没有在happy中反映出来。
问题在另一个方向不起作用。也就是说,如果我修改happy.cpp,我会在输入' make'后立即反映更改。
我已经在我的Mac OS X上以及Ubuntu机器上使用三个make二进制文件复制了这个问题。所以我必须在编码中做错事。以下是文件的文本,它们与makefile位于同一目录中:
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");
}
};
我认为这个问题很简单,但我对于要检查的内容没有更多的想法。我有一个假设是规则和依赖关系的排序无关紧要。
答案 0 :(得分:0)
正如我评论的那样:
首先,你应该(通常)不#include "HappyLetter.cpp"
happy.cpp
(即使这是可行的,但味道很差)。您应该有一个单独的头文件(使用传统的include guard)
#ifndef HAPPY_INCLUDED
//// file happy.h
#define HAPPY_INCLUDED
class HappyLetter {
public:
void speak();
};
#endif /*HAPPY_INCLUDED*/
(您可以 - 或者 - 在#include <cstdio>
之前决定happy.h
中的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;
}
BTW,您应该使用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
错误!)