2015-09-06 2 views
5

Я пытаюсь протестировать систему управления двигателем, которую я написал с googletest, но я не собирался компилировать коды теста. тест в файле с именем test.cpp, такие как:Gtest: ошибка компиляции теста

#include <gtest/gtest.h> 
#include "../motor.hpp" 
TEST(constructorTest, contructorDefault) 
{ 

} 

И я поставил на тесты основную функцию в другом файле main.cpp.

#include <gtest/gtest.h> 
#include "../motor.hpp" 
int main(int argc, char* argv[]) 
{ 
    ::testing::InitGoogleTest(&argc,argv); 
    RUN_ALL_TESTS(); 
} 

Для компиляции я та или иная строчка следующую строку:

g++ main.cpp test.cpp ../motor.cpp -o test 

В результате я получаю это:

main.cpp:8:17: warning: ignoring return value of ‘int RUN_ALL_TESTS()’, declared with attribute warn_unused_result [-Wunused-result] 
    RUN_ALL_TESTS(); 
       ^
/tmp/ccZ5BaBH.o: In function `main': 
main.cpp:(.text+0x1e): undefined reference to `testing::InitGoogleTest(int*, char**)' 
/tmp/ccZ5BaBH.o: In function `RUN_ALL_TESTS()': 
main.cpp:(.text._Z13RUN_ALL_TESTSv[_Z13RUN_ALL_TESTSv]+0x5): undefined reference to `testing::UnitTest::GetInstance()' 
main.cpp:(.text._Z13RUN_ALL_TESTSv[_Z13RUN_ALL_TESTSv]+0xd): undefined reference to `testing::UnitTest::Run()' 
/tmp/ccFuAMp3.o: In function `__static_initialization_and_destruction_0(int, int)': 
test.cpp:(.text+0x5c): undefined reference to `testing::internal::GetTestTypeId()' 
test.cpp:(.text+0x84): undefined reference to `testing::internal::MakeAndRegisterTestInfo(char const*, char const*, char const*, char const*, void const*, void (*)(), void (*)(), testing::internal::TestFactoryBase*)' 
/tmp/ccFuAMp3.o: In function `constructorTest_contructorDefault_Test::constructorTest_contructorDefault_Test()': 
test.cpp:(.text._ZN38constructorTest_contructorDefault_TestC2Ev[_ZN38constructorTest_contructorDefault_TestC5Ev]+0x14): undefined reference to `testing::Test::Test()' 
/tmp/ccFuAMp3.o:(.rodata._ZTV38constructorTest_contructorDefault_Test[_ZTV38constructorTest_contructorDefault_Test]+0x20): undefined reference to `testing::Test::SetUp()' 
/tmp/ccFuAMp3.o:(.rodata._ZTV38constructorTest_contructorDefault_Test[_ZTV38constructorTest_contructorDefault_Test]+0x28): undefined reference to `testing::Test::TearDown()' 
/tmp/ccFuAMp3.o: In function `constructorTest_contructorDefault_Test::~constructorTest_contructorDefault_Test()': 
test.cpp:(.text._ZN38constructorTest_contructorDefault_TestD2Ev[_ZN38constructorTest_contructorDefault_TestD5Ev]+0x1f): undefined reference to `testing::Test::~Test()' 
/tmp/ccFuAMp3.o:(.rodata._ZTI38constructorTest_contructorDefault_Test[_ZTI38constructorTest_contructorDefault_Test]+0x10): undefined reference to `typeinfo for testing::Test' 
collect2: error: ld returned 1 exit status 

Если удалить test.cpp из компилирования линии я получаю этот другой результат:

main.cpp: In function ‘int main(int, char**)’: 
main.cpp:8:17: warning: ignoring return value of ‘int RUN_ALL_TESTS()’, declared with attribute warn_unused_result [-Wunused-result] 
    RUN_ALL_TESTS(); 
       ^
/tmp/cc61r6NU.o: In function `main': 
main.cpp:(.text+0x1e): undefined reference to `testing::InitGoogleTest(int*, char**)' 
/tmp/cc61r6NU.o: In function `RUN_ALL_TESTS()': 
main.cpp:(.text._Z13RUN_ALL_TESTSv[_Z13RUN_ALL_TESTSv]+0x5): undefined reference to `testing::UnitTest::GetInstance()' 
main.cpp:(.text._Z13RUN_ALL_TESTSv[_Z13RUN_ALL_TESTSv]+0xd): undefined reference to `testing::UnitTest::Run()' 
collect2: error: ld returned 1 exit status 

Что мне делать неправильно?

EDIT

Посмотрите, как Что говорит @RippeR правильно, но теперь я получаю следующее сообщение об ошибке:

/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libgtest.so: undefined reference to `pthread_key_create' 
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libgtest.so: undefined reference to `pthread_getspecific' 
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libgtest.so: undefined reference to `pthread_key_delete' 
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib/libgtest.so: undefined reference to `pthread_setspecific' 

Должен ли я включить что-то еще?

Решение Проблема заключалась в том, чтобы добавить флаг -lpthread для компиляции теста.

+0

Вы не ссылаетесь на Google Test. Добавьте -lgtest в свою команду компиляции и убедитесь, что у вас установлен тест Google на вашем компьютере. – RippeR

ответ

7

Try:

g++ main.cpp test.cpp ../motor.cpp -o test -lgtest -lpthread

Вы должны связать внешние библиотеки, которые вы используете. Включение заголовков недостаточно (если только библиотека не только для заголовка). Если это решение не сработает, или вы получите сообщение об ошибке gcc не можете найти lgtest или gtest, вам необходимо сначала установить его (см. here).

Кроме того, обратите внимание, что RUN_ALL_TESTS(); возвращает значение, так что ваш main() должен выглядеть следующим образом:

#include <gtest/gtest.h> 
#include "../motor.hpp" 
int main(int argc, char* argv[]) 

{ 
    ::testing::InitGoogleTest(&argc,argv); 

    return RUN_ALL_TESTS(); 
} 

Я обновил ответ (проверка 2-й линии), чтобы покрыть следующую проблему. Это то же самое, что и раньше, вы действительно должны начать НАЙТИ ответы на свои проблемы, а не просто спрашивать и ждать, пока кто-то сделает всю работу за вас.

+0

Спасибо, теперь у меня есть еще одна ошибка, которая, я думаю, связана с тем, что вы говорили о внешних libs. Компилятор выдает такие ошибки, как этот: «неопределенная ссылка на« pthread_key_create ». – tul1

+1

@ tul1: я обновил свой ответ. Обратите внимание, что это относится к 1-му, и вы должны выполнить некоторую работу самостоятельно, так как уже есть ответы на такие вопросы, как ваша вторая часть, и вы действительно должны научиться связывать библиотеки, а не ждать, когда кто-то будет работать для вас ... – RippeR

+0

Вы можете есть (я думаю), чтобы поместить информацию о ссылке в конце, чтобы сделать эту работу. – JC1

Смежные вопросы