我的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)
答案 0 :(得分:0)
您的target
和test
目标取决于$(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
时运行测试。