1

我为我的项目创建了一个 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 退出程序,但是有没有办法以不同的方式执行它,所以我不会得到任何“错误”?

提前感谢您的任何答案

4

2 回答 2

1

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

对于你的第二个问题,没有办法做到这一点。当您^C在终端上按下时,它不仅会向 ftp 程序发送中断信号,还会向其make自身发送中断信号。没有办法说服 make 忽略我知道的那个信号。唯一的方法是在 make 周围编写一个包装器,该包装器更改了进程组 ID,因此它没有收到这些信号……但是我不知道 ftp 程序将如何再次加入进程组。

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

然后,如果您想忽略错误,请将您的规则更改为以下内容:

run:
        ./executable/ftp || true
于 2013-06-03T14:38:31.507 回答
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
于 2013-06-03T14:48:44.473 回答