C++ 帮助制作文件

C++ 帮助制作文件,c++,makefile,C++,Makefile,我有一个这样的文件。。。。。。。有些文件位于主目录中,有些文件位于测试目录中 VPATH = tests objects = main.o script.o factory.o serve.o enter.o\ login.o notify.o check.o script : $(objects) g++ $(objects) -lcurl -o script main.o : script.h script.o : enter.h login.h facto

我有一个这样的文件。。。。。。。有些文件位于主目录中,有些文件位于测试目录中

VPATH = tests

objects = main.o script.o factory.o serve.o enter.o\
           login.o notify.o check.o
script : $(objects)
    g++ $(objects) -lcurl -o script

main.o : script.h
script.o : enter.h login.h factory.h
factory.o : check.h notify.h serve.h
check.o :
serve.o : check.h
notify.o :
enter.o : check.h
login.o : check.h

.PHONY : clean
clean :
    -rm *.o script
我想将对象文件保存到其cpp文件的来源目录。。i、 e.如果script.cpp在tests文件夹中,那么我希望script.o也在tests文件夹中。。现在它只是将文件保存在主文件夹中

提前谢谢

编辑1:
我需要稍后将文件添加到tests文件夹。。有没有办法让makefile识别已添加的新文件并对其进行编译?

您可以添加以下内容

 mv *.d $(VPATH)/
在makefile中,类似于:

...
script : $(objects)
    g++ $(objects) -lcurl -o script
    mv *.d $(VPATH)/
...

您可能需要在mv前面添加@,“@mv…

而不是硬编码要生成的文件列表,您可以使用通配符查找源文件。还可以使用替换将其转换为对象文件列表。提供一个将.c构建到.o中的通用规则,您应该已经准备好了

FILES_TO_BUILD := $(wildcard *.c) $(wildcard tests\*.c)
OBJECTS_FILES  := $(patsubst %.c,%.o,$(FILES_TO_BUILD))

%.o: %.c
    $(CC) $(COPTS) $^ # or whatever your compiler line is

script: $(OBJECT_FILES)
    g++ $^ -lcurl -o $@

我还没有测试过这个makefile(它只是我的一个想法),但它应该给你一些东西作为开始。

使用VPATH对你来说是必不可少的吗?如果您只是显式地将tests/作为适当的对象文件名的前缀,那么一切都应该正常工作。考虑到示例项目中的文件非常少,使用
头文件:=$(通配符*.h)
查找所有头文件并使用
%.o:%.c$(头文件)
使通用目标的所有内容都依赖于其他内容可能是最简单的。如果有任何更改,您将不得不重建所有内容,但只有14个文件,完整重建应该不会太糟糕。如果你有一个更大的项目,你可能会想要一个更有效的解决方案。