ftfile服务器的makefile - 修改头文件时编译

时间:2013-06-03 14:24:51

标签: c++ makefile header-files ftp-server

我为我的项目创建了一个makefile,它看起来像这样:

CC = g++
LDFLAGS = -lpthread
CFLAGS = -Wall -pedantic -Wno-long-long -O0 -ggdb
SOURCES = main.o List.o ProcessCommands.o HandleTransfers.o

all:    $(SOURCES)

%.o: %.cpp
    $(CC) $< -o $@ -c $(CFLAGS) $(LDFLAGS)

compile:
    $(CC) $(SOURCES) -o executable/ftp $(LDFLAGS)

run:
    ./executable/ftp

clean:
    rm -rf *o ftp 

doc:
    doxygen ftpDocConf

主要问题是,当我修改任何头文件(包含在我的一个源文件中)时,“make all”命令不会注意到任何更改,因此返回“make:无需为'all'做任何事情“。我在互联网上搜索过但仍无法使用它。我对makefile也有另一个“问题”。这个makefile用于的项目是一个ftp服务器,当我输入“make run”来运行可执行文件时,对服务器执行一些操作并退出程序makefile返回“make: * [run ] 打断”。有没有办法让这条消息不出现?我想这似乎是因为我使用ctrl + c退出程序,但有没有办法以不同的方式做到这一点,所以我不会得到任何“错误”?

提前感谢您的回答

2 个答案:

答案 0 :(得分:1)

更改头文件时目标文件不重新编译的原因是您没有声明任何头文件是目标文件的先决条件。您必须明确地执行此操作,或者安排自动生成该信息(通常由您的编译器)。您的模式规则%.o : %.cpp告诉您,如果.cpp文件发生更改,则必须重建关联的.o文件。您需要添加一些xxx.o : xxx.h ...规则,以便make知道头文件。或者,正如我所提到的,安排它们自动生成。有很多解决方案,例如:GNU make: Generating automatic dependencies with generated header files

对于你的第二个问题,没有办法做到这一点。当您在终端上按^C时,它不仅会向ftp程序发送中断信号,还会向make本身发送中断信号。没有办法说服make忽略我所知道的那个信号。唯一的方法是在make周围编写一个包装器来改变进程组ID,这样它就不会收到那些信号......但是我不知道ftp程序如何再次加入进程组。 / p>

如果这是一个严重的问题,我建议你找一个破坏性较小的退出程序的方法。也许您可以使用kill或类似内容直接向流程发送SIGHUP或SIGTERM。

然后,如果您希望make忽略该错误,请将规则更改为以下内容:

run:
        ./executable/ftp || true

答案 1 :(得分:1)

MadScientist很好地解释了你的标题问题。我可以添加这些便宜又脏的修复:

# header files added as dependencies of .o files below
%.o: %.cpp header1.h header2.h header3.h
    $(CC) $< -o $@ -c $(CFLAGS) $(LDFLAGS)

要解决make run问题,可以将运行目标更改为在xterm中执行 - 这样xterm捕获信号,而不是make:

run:
    xterm -e ./executable/ftp