[英]How do I set up Google Test with a GNU Make project?
Since there's basically no documentation on the Google Test webpage—how do I do that?由于 Google Test 网页上基本上没有文档——我该怎么做? What I have done until now:
到目前为止我所做的:
./configure && make
inside it./configure && make
-Igtest/include
-Lgtest/lib
to my compiler/linker flags-Igtest/include
-Lgtest/lib
I wrote a small sample test:我写了一个小样本测试:
#include "gtest/gtest.h" int main(int argc, char **args) { return 0; } TEST(someTest,testOne) { ASSERT_EQ(5,5); }
This compiles fine, but the linker seems not to be amused at all.这编译得很好,但链接器似乎根本没有被逗乐。 I get a huge pile of error messages in the style of
我收到了大量的错误消息
test/main.o: In function
someTest_testOne_Test::TestBody()': main.cpp:(.text+0x96): undefined reference to
testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)'test/main.o: 在函数
someTest_testOne_Test::TestBody()': main.cpp:(.text+0x96): undefined reference to
testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)'
Now what did I forget to do?现在我忘了做什么?
The best example Makefile is the one distributed with Google Test .最好的例子 Makefile 是与 Google Test 一起分发的。 It shows you how to link
gtest_main.a
or gtest.a
with your binary based on whether you want to use Google's main()
function or your own.它向您展示了如何根据您是要使用 Google 的
main()
函数还是您自己的函数,将gtest_main.a
或gtest.a
与您的二进制文件链接gtest_main.a
。
Before I add something to a project makefile, I like to figure out what commands it is actually running.在向项目生成文件添加内容之前,我喜欢弄清楚它实际运行的是哪些命令。 So here is a list of commands that I used to build the sample1 unit test by hand.
所以这里是我用来手动构建 sample1 单元测试的命令列表。
g++ -c -I../include sample1.cc g++ -c -I../include sample1.cc
g++ -c -I../include sample1_unittest.cc g++ -c -I../include sample1_unittest.cc
g++ -pthread -o s1_ut sample1.o sample1_unittest.o ../lib/.libs/libgtest.a ../lib/.libs/libgtest_main.a g++ -pthread -o s1_ut sample1.o sample1_unittest.o ../lib/.libs/libgtest.a ../lib/.libs/libgtest_main.a
Note: If you get a bunch of pthread related linker errors, you forgot the -pthread in the 3rd command.注意:如果您收到一堆与 pthread 相关的链接器错误,则您忘记了第三个命令中的 -pthread。 If you get a bunch of C++ runtime library related linker errors, you typed gcc instead of g++.
如果你得到一堆与 C++ 运行时库相关的链接器错误,你输入的是 gcc 而不是 g++。
Just as a reference I have a docker
system setup with g++
and gtest
which works properly.正如参考我有一个
docker
系统设置与g++
和gtest
其正常工作。 I provide all the files here for future reference:我在这里提供所有文件以供将来参考:
FROM gcc:9.2.0
WORKDIR /usr/src/app
RUN apt-get -qq update \
&& apt-get -qq install --no-install-recommends cmake \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN git clone --depth=1 -b master https://github.com/google/googletest.git
RUN mkdir googletest/build
WORKDIR /usr/src/app/googletest/build
RUN cmake .. \
&& make \
&& make install \
&& rm -rf /usr/src/app/googletest
WORKDIR /usr/src/app
COPY . .
RUN mkdir obj
RUN make
CMD [ "./main" ]
CXX = g++
CXXFLAGS = -std=c++17 -Wall -I h -I /usr/local/include/gtest/ -c
LXXFLAGS = -std=c++17 -I h -pthread
OBJECTS = ./obj/program.o ./obj/main.o ./obj/program_unittest.o
GTEST = /usr/local/lib/libgtest.a
TARGET = main
$(TARGET): $(OBJECTS)
$(CXX) $(LXXFLAGS) -o $(TARGET) $(OBJECTS) $(GTEST)
./obj/program.o: ./cpp/program.cpp
$(CXX) $(CXXFLAGS) ./cpp/program.cpp -o ./obj/program.o
./obj/program_unittest.o: ./cpp/program_unittest.cpp
$(CXX) $(CXXFLAGS) ./cpp/program_unittest.cpp -o ./obj/program_unittest.o
./obj/main.o: ./cpp/main.cpp
$(CXX) $(CXXFLAGS) ./cpp/main.cpp -o ./obj/main.o
clean:
rm -fv $(TARGET) $(OBJECTS)
#include <iostream>
#include "program.h"
#include "gtest/gtest.h"
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
std::cout << "RUNNING TESTS ..." << std::endl;
int ret{RUN_ALL_TESTS()};
if (!ret)
std::cout << "<<<SUCCESS>>>" << std::endl;
else
std::cout << "FAILED" << std::endl;
return 0;
}
#include "program.h"
// Returns n! (the factorial of n). For negative n, n! is defined to be 1.
int Factorial(int n)
{
int result = 1;
for (int i = 1; i <= n; i++)
{
result *= i;
}
return result;
}
// Returns true if and only if n is a prime number.
bool IsPrime(int n)
{
// Trivial case 1: small numbers
if (n <= 1)
return false;
// Trivial case 2: even numbers
if (n % 2 == 0)
return n == 2;
// Now, we have that n is odd and n >= 3.
// Try to divide n by every odd number i, starting from 3
for (int i = 3;; i += 2)
{
// We only have to try i up to the square root of n
if (i > n / i)
break;
// Now, we have i <= n/i < n.
// If n is divisible by i, n is not prime.
if (n % i == 0)
return false;
}
// n has no integer factor in the range (1, n), and thus is prime.
return true;
}
#include <limits.h>
#include "program.h"
#include "gtest/gtest.h"
namespace
{
// Tests Factorial().
// Tests factorial of negative numbers.
TEST(FactorialTest, Negative)
{
// This test is named "Negative", and belongs to the "FactorialTest"
// test case.
EXPECT_EQ(1, Factorial(-5));
EXPECT_EQ(1, Factorial(-1));
EXPECT_GT(Factorial(-10), 0);
}
// Tests factorial of 0.
TEST(FactorialTest, Zero)
{
EXPECT_EQ(1, Factorial(0));
}
// Tests factorial of positive numbers.
TEST(FactorialTest, Positive)
{
EXPECT_EQ(1, Factorial(1));
EXPECT_EQ(2, Factorial(2));
EXPECT_EQ(6, Factorial(3));
EXPECT_EQ(40320, Factorial(8));
}
// Tests IsPrime()
// Tests negative input.
TEST(IsPrimeTest, Negative)
{
// This test belongs to the IsPrimeTest test case.
EXPECT_FALSE(IsPrime(-1));
EXPECT_FALSE(IsPrime(-2));
EXPECT_FALSE(IsPrime(INT_MIN));
}
// Tests some trivial cases.
TEST(IsPrimeTest, Trivial)
{
EXPECT_FALSE(IsPrime(0));
EXPECT_FALSE(IsPrime(1));
EXPECT_TRUE(IsPrime(2));
EXPECT_TRUE(IsPrime(3));
}
// Tests positive input.
TEST(IsPrimeTest, Positive)
{
EXPECT_FALSE(IsPrime(4));
EXPECT_TRUE(IsPrime(5));
EXPECT_FALSE(IsPrime(6));
EXPECT_TRUE(IsPrime(23));
}
#ifndef GTEST_PROGRAM_H_
#define GTEST_PROGRAM_H_
// Returns n! (the factorial of n). For negative n, n! is defined to be 1.
int Factorial(int n);
// Returns true if and only if n is a prime number.
bool IsPrime(int n);
#endif // GTEST_PROGRAM_H_
cpp/program.cpp
and h/program.h
files are from the googletest
repo sample 1 . cpp/program.cpp
和h/program.h
文件来自googletest
repo sample 1 。 Dockerfile
is adapted from here . Dockerfile
改编自此处。
我使用sudo apt-get install libgtest-dev
在我的系统上安装了 Google Test 并且我正在使用的 Fixture 没有main()
并且可以使用以下方法构建:
g++ unitTest.cpp -o unitTest /usr/src/gtest/src/gtest_main.cc /usr/src/gtest/src/gtest-all.cc -I /usr/include -I /usr/src/gtest -L /usr/local/lib -lpthread
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.