为FTP服务器制作文件-当头文件被修改时编译

makefile for ftp server - compile when header file modified

本文关键字:文件 修改 编译 FTP 服务器      更新时间:2023-10-16

我为我的项目创建了一个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: Nothing to be done for ' all'"。我已经在网上搜索过了,但仍然无法让它工作。我对makefile还有另一个"问题"。这个makefile用于的项目是一个ftp服务器,当我输入"make run"来运行可执行文件时,对服务器做一些事情并退出程序,makefile返回"make: * [run] Interrupt"。有没有办法让这个消息不出现?我猜它出现是因为我使用ctrl+c退出程序,但有一种方法可以做到不同,所以我不会得到任何"错误"?

提前感谢您的回答

当您更改头文件时,目标文件不会重新编译的原因是您没有将任何头文件声明为目标文件的先决条件。您必须显式地执行此操作,否则将该信息安排为自动生成(通常由编译器生成)。你的模式规则%.o : %.cpp告诉make,如果一个.cpp文件改变了,关联的.o文件必须重建。您需要添加一些xxx.o : xxx.h ...规则,以便make也知道头文件。或者,正如我提到的,让它们自动生成。这里有很多解决方案,例如:GNU make:用生成的头文件生成自动依赖

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

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

如果你想忽略这个错误,把你的规则改成这样:

run:
        ./executable/ftp || true

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就可以捕获信号,而不是执行:

run:
    xterm -e ./executable/ftp