无法在OSX Yosemite上编译googletest

时间:2015-11-30 06:53:09

标签: c++ macos googletest

我已经在网上阅读了一些相关的答案和一些文章以及官方的Google测试文档,但由于我缺乏这方面的经验,我对一些事情非常不安全并寻求指导。

我正在用c ++开始一个全新的宠物项目,我想在编写代码时编写适当的测试,遇到Google Test并决定尝试一下。

目前这是我的文件夹结构:

/
/bin
/main.cpp
/lib
/lib/db
/lib/external/googletest

我的想法是将测试和类文件放在自己的文件夹中,例如:

/lib/db/db.h
/lib/db/db.cpp
/lib/db/db.test

问题#1

是否存在包含测试的文件的命名约定或期望? (上例中的/lib/db/db.test

问题#2

我运行了以下命令

  1. cd lib / external / googletest / googletest
  2. cmake。
  3. 使
  4. make install
  5. cp lib * .a / usr / local / lib
  6. cp -r include / gtest / / usr / local / include /
  7. 看看它最终如何在/ usr / local / include / gtest中创建一系列.h文件,我希望能够#include <gtest/gtest.h>能够运行测试,我将其添加到我的主的.cpp:

    TEST(Param1, Param2) {
        EXPECT_EQ(1, 1);
    }
    

    当出现以下错误时出现:

    Undefined symbols for architecture x86_64:
      "testing::AssertionSuccess()", referenced from:
          testing::AssertionResult testing::internal::CmpHelperEQ<int, int>(char const*, char const*, int const&, int const&) in main-230b96.o
      "testing::Test::SetUp()", referenced from:
          vtable for Param1_Param2_Test in main-230b96.o
      "testing::Test::TearDown()", referenced from:
          vtable for Param1_Param2_Test in main-230b96.o
      "testing::Test::Test()", referenced from:
          Param1_Param2_Test::Param1_Param2_Test() in main-230b96.o
      "testing::Test::~Test()", referenced from:
          Param1_Param2_Test::~Param1_Param2_Test() in main-230b96.o
      "testing::Message::Message()", referenced from:
          Param1_Param2_Test::TestBody() in main-230b96.o
      "testing::internal::AssertHelper::AssertHelper(testing::TestPartResult::Type, char const*, int, char const*)", referenced from:
          Param1_Param2_Test::TestBody() in main-230b96.o
      "testing::internal::AssertHelper::~AssertHelper()", referenced from:
          Param1_Param2_Test::TestBody() in main-230b96.o
      "testing::internal::GetTestTypeId()", referenced from:
          ___cxx_global_var_init in main-230b96.o
      "testing::internal::MakeAndRegisterTestInfo(char const*, char const*, char const*, char const*, testing::internal::CodeLocation, void const*, void (*)(), void (*)(), testing::internal::TestFactoryBase*)", referenced from:
          ___cxx_global_var_init in main-230b96.o
      "testing::internal::IsTrue(bool)", referenced from:
          testing::internal::scoped_ptr<std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::reset(std::__1::basic_stringstream<char, std::__1::char_traits<char>, std::__1::allocator<char> >*) in main-230b96.o
          testing::internal::scoped_ptr<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::reset(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*) in main-230b96.o
      "testing::internal::EqFailure(char const*, char const*, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)", referenced from:
          testing::AssertionResult testing::internal::CmpHelperEQFailure<int, int>(char const*, char const*, int const&, int const&) in main-230b96.o
      "testing::internal::AssertHelper::operator=(testing::Message const&) const", referenced from:
          Param1_Param2_Test::TestBody() in main-230b96.o
      "typeinfo for testing::Test", referenced from:
          typeinfo for Param1_Param2_Test in main-230b96.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    make: *** [all] Error 1
    

    解决方案

    感谢trojanfoe我修改了我的makefile看起来像这样:

    CC=g++
    target_folder=bin
    all:
        $(CC) *.cpp -o $(target_folder)/prod
        ./bin/prod
    test:
        $(CC) *.cpp -o $(target_folder)/test lib/external/googletest/googletest/libgtest.a lib/external/googletest/googletest/libgtest_main.a
        ./bin/test
    clean:
        rm -f $(target_folder)/* *.o
    

    现在它工作正常,请记住这是一个骨架项目,我需要构建测试文件和入口点,所以此时它只是编译一个基本测试。

1 个答案:

答案 0 :(得分:2)

您忘记了将google测试库与可执行文件链接在一起。