使不更新可执行文件
Make Does Not Update Executable
我写了下面的制作文件:
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机器上复制了三个制作二进制文件。所以我一定在编码中做错了什么。以下是文件的文本,它们与生成文件位于同一目录中:
快乐.cpp
#include "HappyLetter.cpp"
int main()
{
printf("Hello from happy.cpp!n");
HappyLetter *myObj = new HappyLetter();
myObj->speak();
return 0;
}
快乐信.cpp
#include <cstdio>
class HappyLetter {
public:
void speak()
{
printf("Hello from HappyLetter.cpp!n");
}
};
我相信问题很简单,但我对检查什么没有更多的想法。我的一个假设是规则和依赖项的顺序无关紧要。
正如我评论的那样:
首先,你不应该(传统上)在你的happy.cpp
中#include "HappyLetter.cpp"
(即使这是可行的,但品味很差)。您应该有一个单独的头文件(使用常规的包含保护)
#ifndef HAPPY_INCLUDED
//// file happy.h
#define HAPPY_INCLUDED
class HappyLetter {
public:
void speak();
};
#endif /*HAPPY_INCLUDED*/
(您可以 - 也可以不 - 决定例如 #include <cstdio>
在class HappyLetter
前的happy.h
;有充分的理由做到这两种方式!
然后你应该有第一个源文件:
// 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;
}
顺便说一句,你应该使用智能指针!
然后你有第二个源文件:
// file happyletter.cpp
#include <cstdio>
#include "happy.h"
void HappyLetter::speak() {
printf("Hello from HappyLetter.cpp!n");
}
最后,一个Makefile
(见这里获得灵感),比如:
# 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的信息,特别是教程,C++书中的良好编程,浏览一下标准(例如n3337草案)。另请阅读有关make的信息,特别是GNU make。
研究一些用C++编码的现有自由软件的源代码(参见sourceforge或github等)。
(所以你把C++源文件和Makefile
都弄错了!
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 如何将图像传入C++可执行文件并将输出图像存储在新目录中?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- 如何在 linux 可执行文件中使用静态库
- 错误:当我从"WinDbg"打开可执行文件时,找不到符号文件。默认导出 ntdll 的符号.dll
- 编译的C可执行文件被Windows defender检测为病毒
- Linux 可执行文件通过 dlopen 在emplace_back崩溃打开共享库
- 是否可以在命令行中将输入参数传递给可执行文件
- 如何在可执行文件中存储常量数组?
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 可执行文件C++包括.obj,.lib和.dll吗?
- 在运行时动态更新二进制文件(可执行文件)而不停止的任何类型的方法
- 使不更新可执行文件