将对象创建与链接相结合的Makefile



我正在尝试遵循并转换[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中使用反斜杠。目录分隔符应该使用正斜杠。

如果你确实想使用反斜杠,至少你不应该在变量赋值的末尾添加它们。

相关内容

  • 没有找到相关文章

最新更新