2015-11-30 5 views
2

Я прочитал несколько связанных ответов и некоторые статьи в Интернете, а также официальную документацию Google Test, но, поскольку мне не хватает опыта в этой области, я очень не уверен в некоторых вещах и прошу совета.Невозможно скомпилировать googletest на OSX Yosemite

Я начинаю новый проект для домашних животных в 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. кд Библиотека/внешний/googletest/googletest
  2. CMake.
  3. сделать
  4. сделать установки
  5. сП Lib * .a/USR/местные/Библиотека
  6. ф -r включить/GTEST// USR/местные/включить/

и видеть, как это в конечном итоге создать серию .h файлов в/USR/местные/включать/GTEST, я ожидал, чтобы быть в состоянии #include <gtest/gtest.h> и иметь возможность запускать тесты, я добавил это к моему main.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 

И теперь он работает просто отлично, пожалуйста, продолжайте в виду, что это проект скелета, и мне нужно структурировать тестовые файлы и точку входа, поэтому на данный момент он просто компилирует базовый тест.

+0

Нет ли библиотеки, с которой вам нужно связать? Вы, кажется, не делаете этого ... – trojanfoe

+0

@trojanfoe Вот оно! Я добавил '/ usr/local/lib/libgtest_main.a' в make-файл как еще один параметр, и он исправил его! Если вы переписываете свой комментарий в качестве ответа, я буду отмечать его как правильное – Purefan

ответ

2

Вы забыли связать тестовую библиотеку Google с вашим исполняемым файлом.