我正在尝试遵循并转换[this][1]Googletest教程,以便在windows中工作,并使用Make进行构建。我还试图添加一个更典型的目录结构。[1] :https://www.eriksmistad.no/getting-started-with-google-test-on-ubuntu/
我的目录结构:
D:.
│ makefile
│
├───bin
├───inc
│ whattotest.h
│
├───obj
├───src
│ whattotest.cpp
│
└───tests
tests.cpp
whattotest.h
#pragma once
double squareRoot(const double a);
whattotest.cpp
#include <math.h>
#include "whattotest.h"
double squareRoot(const double a) {
double b = sqrt(a);
if(b != b) { // nan check
return -1.0;
}else{
return sqrt(a);
}
}
tests.cpp
#include "whattotest.h"
#include <gtest/gtest.h>
TEST(SquareRootTest, PositiveNos) {
ASSERT_EQ(6, squareRoot(36.0));
ASSERT_EQ(18.0, squareRoot(324.0));
ASSERT_EQ(25.4, squareRoot(645.16));
ASSERT_EQ(0, squareRoot(0.0));
}
TEST(SquareRootTest, NegativeNos) {
ASSERT_EQ(-1.0, squareRoot(-15.0));
ASSERT_EQ(-1.0, squareRoot(-0.2));
}
int main(int argc, char **argv) {
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
生成文件
CXX = g++
OBJ = obj
SRC = src
TESTS = tests
INC = inc
BIN = bin
LIBS= -lpthread
GTEST=D:myWorkspaceGtestgoogletest-release-1.11.0googletestinclude
LIBGTEST=D:myWorkspaceGtestgoogletest-release-1.11.0liblibgtest.a
.PHONY : all
all: $(BIN)/runTests
$(BIN)/runTests: $(OBJ)/tests.o $(OBJ)/whattotest.o $(LIBGTEST)
#g++ -o runTests obj/tests.o obj/whattotest.o <path to libgtest.a> -pthread
$(CXX) -o $@ $^ $(LIBS)
$(OBJ)/tests.o: $(TESTS)/tests.cpp
#g++ -I <path to gtest> -I inc -c tests.cpp -o tests.o
$(CXX) -I $(GTEST) -I $(INC) -c $< -o $@
$(OBJ)/whattotest.o: $(SRC)/whattotest.cpp
$(CXX) -I $(INC) -c $< -o $@
clean:
-rm $(OBJ)/*.o
-rm $(BIN)/*.exe
当我运行这个时,我得到以下错误:
g++ -I D:myWorkspaceGtestgoogletest-release-1.11.0googletestinclude LIBGTEST=D:myWorkspaceGtestgoogletest-release-1.11.0liblibgtest.a -I inc -c tests/tests.cpp -o obj/tests.o
g++: warning: LIBGTEST=D:myWorkspaceGtestgoogletest-release-1.11.0liblibgtest.a: linker input file unused because linking not done
g++: error: LIBGTEST=D:myWorkspaceGtestgoogletest-release-1.11.0liblibgtest.a: linker input file not found: Invalid argument
make: *** [makefile:19: obj/tests.o] Error 1
我认为运行该程序的方式是让Make查看不存在的Rule for runTests requires tests.o,然后下拉并使用该Rule创建该对象文件。之后,返回到运行测试的规则并完成。
输出看起来像是Make将这两个规则组合在一起,并将-c和.cpp文件组合在一起。我认为这是导致这个错误发生的原因。
我很困惑Make为什么要这么做。
检查此项:
GTEST=D:myWorkspaceGtestgoogletest-release-1.11.0googletestinclude
LIBGTEST=D:myWorkspaceGtestgoogletest-release-1.11.0liblibgtest.a
通过在GTEST
变量赋值的末尾有一个反斜杠,您可以将该行延续到下一行,因此GTEST
也包含下一行的变量赋值(并且未设置LIBGTEST
(。
你基本上已经写过了:
GTEST=D:myWorkspaceGtestgoogletest-release-1.11.0googletestinclude LIBGTEST=D:myWorkspaceGtestgoogletest-release-1.11.0liblibgtest.a
通常,您不应该在makefile中使用反斜杠。目录分隔符应该使用正斜杠。
如果你确实想使用反斜杠,至少你不应该在变量赋值的末尾添加它们。