Я с трудом пытаюсь установить 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
Я думаю, компоновщик не может найти файлы библиотеки. Кто-нибудь знает, как это исправить?
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
Хорошо, теперь я успешно начал использовать 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
Чтобы дать контекст ответу Павла, скомпилированный двоичный файл 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, и для тестов.
blockquote>Итак, ваша первоначальная проблема заключалась в том, что при установке пакета
google-mock
был установлен только исходный код, а когда вы пытались скомпилировать пример приложения, библиотека gmock не была найдена.
Всего, я использую два метода установки, но во втором методе необходимо создать 'CMakeLists.txt' (где данные проекта будут обозначены, подкаталог), файл сами, и поместите его в '/root/my_build каталог'. Я должен был удалить старую версию 'cmake' и установить новый. Я пытался установить на Ubuntu 18.04.3 LTS 'gmock' на корне и всем связанном с его установкой.
метод 1:
# apt search gmock
# apt-get install
Ваш метод gmock
версии 2:
# apt install unzip
# wget https://github.com/cfmobile/gmock/archive/master.zip
# unzip master.zip -d /${GMOCK_ROOT}
# cd ${GMOCK_ROOT}
# mkdir my_build
# cd my_build
# cmake ..
# cd ..
(выходят от my_build, если 'CMakeLists.txt' не нашел, необходимо создать его сами).
находят и удаляют старую версию cmake:
# apt list --installed | grep cmake
# apt-get remove cmake
# cmake --version
# reboot
устанавливают новую версию cmake:
# wget https://github.com/Kitware/CMake/releases/download/v3.15.3/cmake-3.15.3.tar.gz
# tar -zxvf cmake-3.15.3.tar.gz
# cd cmake-3.15.3
# ./configure
# make
# make install
# reboot
снова возвращаются к/root/my_build:
# cd my_build
# cmake ..
# make --jobs 4
# cd $GMOCK_HOME/gtest
# mkdir
# cd my_build
# cmake ..
# make --jobs 4