某些更改后,Make不会重建项目

时间:2015-07-18 18:33:31

标签: c++ makefile

我的C ++项目有一些单元测试。当我更改测试代码时,Make看不到或编译它。但是,当我更改C ++类代码时,请正确地重建它。 这是我的Makefile:

CC=g++
CFLAGS := -std=c++11

SRCDIR := src
SRCEXT := cpp
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))

TESTDIR := test
TESTSOURCES := $(shell find $(TESTDIR) -type f -name *.$(SRCEXT))

BUILDDIR := build
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))

TARGET := bin/main
TESTTARGET := bin/test

MAINS := build/main.o
TESTOBJECTS := $(filter-out  $(MAINS), $(OBJECTS))

all: $(TARGET)

$(TARGET): $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o $(TARGET)


$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
    @mkdir -p $(BUILDDIR)
    $(CC) $(CFLAGS) -c -o $@ $<


test: $(TESTTARGET)

$(TESTTARGET): $(OBJECTS)
    $(CC) $(CFLAGS)  -L/usr/include/unittest++ $(TESTOBJECTS) $(TESTSOURCES) -lunittest++  -o $(TESTTARGET)



clean:
    rm $(BUILDDIR)/*.o
    rm $(TARGET)
    rm $(TESTTARGET)

2 个答案:

答案 0 :(得分:0)

您的targettest目标取决于$(OBJECTS)TESTSOURCES独立于CC=g++ CFLAGS := -std=c++11 SRCEXT := cpp BUILDDIR := build SRCDIR := src SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT)) OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o)) TARGET := bin/main MAINS := build/main.o TESTDIR := test TESTSOURCES := $(shell find $(TESTDIR) -type f -name *.$(SRCEXT)) TESTOBJECTS := $(patsubst $(TESTDIR)/%,$(BUILDDIR)/%,$(TESTSOURCES:.$(SRCEXT)=.o)) TESTOBJECTS += $(filter-out $(MAINS), $(OBJECTS)) TESTTARGET := bin/test MAINS := build/main.o .PHONY: target test clean all: target # Objects $(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT) @mkdir -p $(BUILDDIR) $(CC) $(CFLAGS) -c -o $@ $< target: $(TARGET) $(TARGET): $(OBJECTS) $(CC) $(CFLAGS) $(OBJECTS) -o $(TARGET) test: $(TESTTARGET) $(TESTTARGET): $(OBJECTS) $(TESTOBJECTS) $(CC) $(CFLAGS) $(OBJECTS) $(TESTOBJECTS) -o $(TESTTARGET) -L/usr/include/unittest++ -lunittest++ clean: rm $(BUILDDIR)/*.o rm $(TARGET) rm $(TESTTARGET) 。所以你所描述的是预期的行为。

编辑:一个工作示例可能看起来像这样(未经验证)

string fbUA = HttpContext.Current.Request.UserAgent;

            if (RouteData.Values["NewsId"] != null)
            {
                if (fbUA.Contains("FacebookExternalHit") || fbUA.Contains("Googlebot"))
                {
                    int qryStr = int.Parse(RouteData.Values["NewsId"] as string);
                    BindSingleNews(qryStr);
                    BindRelatesNews(qryStr);
                    HandleLoginMenu();
                }
                else
                {
                    if (Session["UserName"] == null && Session["UserId"] == null)
                    {
                        RequestLogin();
                    }
                    else
                    {
                        int qryStr = int.Parse(RouteData.Values["NewsId"] as string);
                        BindSingleNews(qryStr);
                        BindRelatesNews(qryStr);
                        HandleLoginMenu();
                    }
                }                 
            }
            else
            {
                Response.Redirect("/");
            }

答案 1 :(得分:0)

您应该只在需要时编译测试文件(运行make test时),只需运行make(您的all目标)就没有必要编译它们。

我还建议您将test目标更改为:

test: $(TARGET) $(TESTTARGET)

因此,如果您只对您的(非测试)代码进行了更改,那么它也会被提取。

另一个建议可能是你在编译$(TESTTARGET)目标后也运行test,以便在运行make test时运行测试。