Как установить Google-макет на Ubuntu 12.10

Я с трудом пытаюсь установить Google C ++ Mocking Framework. Я успешно запустил sudo apt-get install google-mock. Затем я попытался скомпилировать этот пример файла

#include "gmock/gmock.h"
int main(int argc, char** argv) {
  ::testing::InitGoogleMock(&argc, argv);
  return RUN_ALL_TESTS();
}

с g++ -lgmock main.cpp, и эти ошибки показали

main.cpp:(.text+0x1e): undefined reference to `testing::InitGoogleMock(int*, char**)'
main.cpp:(.text+0x23): undefined reference to `testing::UnitTest::GetInstance()'
main.cpp:(.text+0x2b): undefined reference to `testing::UnitTest::Run()'
collect2: error: ld returned 1 exit status

Я думаю, компоновщик не может найти файлы библиотеки. Кто-нибудь знает, как это исправить?

5
задан 13.02.2020, 07:59

3 ответа

Хорошо, теперь я успешно начал использовать gmock, создав свою собственную версию в соответствии с README, предоставляемым с исходной загрузкой с веб-сайта проекта googlemock.

Загрузите zip-файл для загрузки с веб-сайта: http://code.google.com/p/googlemock/downloads/list

Распакуйте его в каталог, скажем ${GMOCK_ROOT}. Затем в соответствии с инструкциями README :

cd ${GMOCK_ROOT}
mkdir build
cd build
g++ -I../gtest/include -I../gtest -I../include -I.. -c ../gtest/src/gtest-all.cc
g++ -I../gtest/include -I../gtest -I../include -I.. -c ../src/gmock-all.cc
ar -rv libgmock.a gtest-all.o gmock-all.o

Таким образом, у вас есть собственный libgmock.a в ${GMOCK_ROOT}/build. На самом деле вам также нужны pthreads для компиляции, поэтому ваша команда компиляции после этого становится:

g++ -I${GMOCK_ROOT}/include/ main.cpp -L${GMOCK_ROOT}/build -lgmock -lpthread
7
ответ дан 13.02.2020, 08:01
  • 1
    Подтвержденный, что это работает. Задание Goog! Я просто задаюсь вопросом, почему порядок g ++' s важные параметры. – JBentley 13.02.2020, 08:02

libgmock-dev будет включен в стандартные репозитории Ubuntu 18.10, в противном случае в более ранних выпусках Ubuntu вам придется вручную загрузить и установить его.

sudo apt-get install libgmock-dev
cd /usr/src/gmock
sudo mkdir build
sudo cmake ..
sudo make
sudo cp *.a /usr/lib
3
ответ дан 13.02.2020, 08:00
  • 1
    удостоверьтесь, что Вы добавляете подробное объяснение того, что Вы предлагаете пользовательские попытки. – Cliff Ribaudo 13.02.2020, 08:00

Чтобы дать контекст ответу Павла, скомпилированный двоичный файл Google Mock не распространяется с пакетом Ubuntu по причине, указанной здесь здесь . Это объяснение относится к Google Test, но этот принцип применим к любой библиотеке C ++.

В частности, в нем говорится:

В первые дни мы говорили, что вы можете установить скомпилированные библиотеки Google Test в * nix системах, используя make install. Тогда каждый пользователь вашей машины сможет писать тесты без перекомпиляции Google Test.

Это казалось хорошей идеей, но у нее есть кое-что: каждый пользователь должен скомпилировать свои тесты, используя те же флаги компилятора, которые использовались для компиляции установленных библиотек Google Test; в противном случае он может столкнуться с неопределенным поведением (т. е. тесты могут вести себя странно и даже не работать без видимых причин).

Почему? Поскольку в C ++ есть такая вещь, которая называется правилом одного определения: если два исходных файла C ++ содержат разные определения одного и того же класса / функции / переменной и вы связываете их вместе, вы нарушаете правило. Компоновщик может или не может поймать ошибку (во многих случаях это не требуется стандартом C ++, чтобы поймать нарушение). Если этого не произойдет, вы получите странное поведение во время выполнения, которое будет неожиданным и сложным для отладки.

Если вы компилируете Google Test и свой тестовый код, используя разные флаги компилятора, они могут увидеть разные определения одного и того же класса / функции / переменной (например, из-за использования #if в Google Test). Поэтому для вашего удобства мы рекомендуем избегать установки предварительно скомпилированных библиотек Google Test. Вместо этого каждый проект должен сам скомпилировать Google Test, чтобы быть уверенным, что одни и те же флаги используются и для Google Test, и для тестов.

Итак, ваша первоначальная проблема заключалась в том, что при установке пакета google-mock был установлен только исходный код, а когда вы пытались скомпилировать пример приложения, библиотека gmock не была найдена.

2
ответ дан 13.02.2020, 08:00
  • 1
    Интересно, почему это так. Существуют многие библиотеки C++, которые работают предварительно скомпилированные внутри / lib. – Maciek Czarnik 13.02.2020, 08:01

Теги

Похожие вопросы