Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 在不做任何修改的情况下进行重建_Makefile - Fatal编程技术网

Makefile 在不做任何修改的情况下进行重建

Makefile 在不做任何修改的情况下进行重建,makefile,Makefile,我已经开始为一个库编写几个简单的测试。我目前正在尝试编写一个名为btests的make目标,该目标应该能够编译所有这些测试 测试以简单的.cpp文件的形式驻留在tests/目录中,其中包含库 makefile的任务很简单:将每个tests/name.cpp编译成一个可执行的tests/name文件,该文件已与库链接 它工作得很好,除了一件事:每次我运行makebtests,测试都会被重新编译。但是,只有当它们已更改或库本身已更改时,才应重新编译它们 以下是相关代码: CC=g++ CFLAGS=

我已经开始为一个库编写几个简单的测试。我目前正在尝试编写一个名为
btests
的make目标,该目标应该能够编译所有这些测试

测试以简单的
.cpp
文件的形式驻留在
tests/
目录中,其中
包含库

makefile的任务很简单:将每个
tests/name.cpp
编译成一个可执行的
tests/name
文件,该文件已与库链接

它工作得很好,除了一件事:每次我运行
makebtests
,测试都会被重新编译。但是,只有当它们已更改或库本身已更改时,才应重新编译它们

以下是相关代码:

CC=g++
CFLAGS=-Wall

SRCPATH=source
OBJPATH=object
TESTPATH=tests

OBJ=$(OBJPATH)/nameb.o $(OBJPATH)/hebbann.o
INF=$(SRCPATH)/nameb.hpp $(SRCPATH)/hebbann.hpp
TESTS=$(TESTPATH)/test_api $(TESTPATH)/test_speed


all : libname.a

libname.a : $(OBJ)
    ar rvs libname.a $(OBJ)

$(OBJ) : $(OBJPATH)/%.o : $(SRCPATH)/%.cpp $(SRCPATH)/%.hpp
    $(CC) $(CFLAGS) -c $< -o $@

btests : $(TESTS)

$(TESTS) : % : %.cpp all
    $(CC) $(CFLAGS) $< -L. -lname -o $@

install : all
    mkdir -p /usr/include/name
    cp $(INF) /usr/include/name
    cp libname.a /usr/lib

pack : all
    mkdir -p name/
    cp $(INF) name/
    tar -cvf libname.tar name/ libname.a doc/ source/

clean :
    rm -f $(OBJPATH)/* libname.a libname.tar $(TESTS)
CC=g++
CFLAGS=-Wall
SRCPATH=源
OBJPATH=object
TESTPATH=测试
OBJ=$(OBJPATH)/nameb.o$(OBJPATH)/hebbann.o
INF=$(SRCPATH)/nameb.hpp$(SRCPATH)/hebbann.hpp
测试=$(测试路径)/测试api$(测试路径)/测试速度
全部:libname.a
libname.a:$(OBJ)
ar rvs libname.a$(OBJ)
$(OBJ):$(OBJPATH)/%.o:$(SRCPATH)/%.cpp$(SRCPATH)/%.hpp
$(CC)$(CFLAGS)-c$<-o$@
B测试:$(测试)
$(测试):%:%.cpp全部
$(CC)$(CFLAGS)$<-L.-lname-o$@
安装:全部
mkdir-p/usr/include/name
cp$(INF)/usr/include/name
cp libname.a/usr/lib
包装:全部
mkdir-p名称/
cp$(INF)名称/
tar-cvf libname.tar name/libname.a doc/source/
清洁:
rm-f$(OBJPATH)/*libname.a libname.tar$(测试)

只有当某些内容发生更改时,我如何才能强制make重新编译?

您的测试取决于
所有的
。由于没有名为“all”的文件,Make得出结论,必须重建它,依赖它的测试也必须重建

解决办法很简单。
all
的规则只要求
libname.a
,所以只需去掉中间人:

$(TESTS) : % : %.cpp libname.a
    $(CC) $(CFLAGS) $< -L. -lname -o $@
$(测试):%:%.cpp libname.a
$(CC)$(CFLAGS)$<-L.-lname-o$@

该makefile看起来不错-它真的是您正在使用的吗?我无法重现此问题;你确定这就是你正在使用的makefile,并且没有其他东西会影响各种文件的最后修改时间吗?我删掉了那些看起来与我无关的部分,但我想它们不是。我将添加整个makefile。使用make-d了解它的想法。@AB:不,它只是一个通配符,在测试中依次替换每个元素。