Как скомпилировать googletest на windows с помощью mingw с msys?

Моя потребность проста. Мне нужно скомпилировать и использовать googletest в Windows, используя MinGW с msys. Есть ли у кого-нибудь опыт в этом?

Спасибо за ответы.


person Rusty Horse    schedule 09.03.2011    source источник
comment
Пожалуйста, опишите, что происходит не так.   -  person Jonas Bötel    schedule 09.03.2011
comment
Я добился некоторого прогресса. Вроде не может установить без питона которого у меня нет. Я связываю, чтобы решить это сейчас.   -  person Rusty Horse    schedule 09.03.2011


Ответы (6)


Мне потребовалось некоторое время, но я понял это. Вот руководство для тех, кто сталкивается с той же проблемой.

Чтобы иметь возможность скомпилировать GoogleTest в Windows, следуйте этим инструкциям:

  1. Я предполагаю, что у вас установлен MinGW с MSYS.

  2. Загрузите и установите CMake с официального сайта http://www.cmake.org/. Используйте версию установщика Win32. После завершения процесса установки скопируйте исполняемые файлы из «xxx/CMake/bin» в «xxx/MinWG/bin».

  3. Загрузите и установите Python с http://www.python.org/. Опять же, установщик Windows отлично справляется со своей задачей. После завершения процесса установки скопируйте папку python формы «python.exe» в «xxx/MinWG/bin».

  4. Загрузите последнюю стабильную версию GoogleTest с http://code.google.com/p/googletest/ и распакуйте ее в какой-нибудь папка.

  5. Запустите терминал MSYS и выполните следующие команды.

    cd xxx/gtest-x.x.x
    cmake -G "MSYS Makefiles"
    make
    
  6. Если у вас возникли ошибки компиляции из pthread, следуйте этим инструкциям.

  7. Скопируйте включаемую папку «xxx/gtest-x.x.x/include» в ваш MinGW gcc include. Скопируйте файлы библиотеки «xxx/gtest-x.x.x/*.a» в свою библиотеку MinGW gcc.

  8. При компиляции тестов добавьте параметр "-lgtest" в gcc.

EDIT Комментаторы правы. У меня работало копирование исполняемых файлов, но в целом это не очень хорошая практика. Вместо этого попробуйте использовать символическую ссылку.

person Rusty Horse    schedule 12.03.2011
comment
Зачем копировать, а не создавать символические ссылки на эти исполняемые файлы? - person mbx; 15.03.2011
comment
На самом деле и CMake, и Python не собираются статически, поэтому оба они не работают (сбой и бесконечный цикл) при вызове из оболочки msys. - person mbx; 15.03.2011

Чтобы собрать libgtest.a без cmake/python, а только с помощью mingw make, в gtest теперь есть папка make с простым старым makefile.

  1. Убедитесь, что mingw\bin находится в пути (попробуйте запустить «g++» или что-то в этом роде).
  2. Войдите в папку gtest 'googletest\make' и запустите 'make'.
  3. Чтобы протестировать, запустите «sample1_unittest» (должен появиться результат теста образца gtest).
  4. Чтобы сгенерировать библиотеку libgtest.a, запустите ar -rv libgtest.a gtest-all.o.

Созданная библиотека представляет собой полную статическую библиотеку без генерируемых dll.

Это должно быть все.

Кстати, это также работает для сборки googlemock, просто введите папку googlemock вместо googletest и выполните ту же процедуру.

person Jesper Matthiesen    schedule 18.10.2016
comment
спасибо @jesper-matthiesen это сработало. В случае, если кто-то столкнется с ошибкой ld.exe, не удалось найти lpthread. Попробуйте запустить mingw-get install libpthreadgc-dev, как указано в комментарии ссылка. Спасибо - person v.c; 23.02.2018

Из файла README https://github.com/google/googletest/tree/master/googletest : при создании Google Test как отдельного проекта типичный рабочий процесс начинается с:

mkdir mybuild       # Create a directory to hold the build output.
cd mybuild
cmake ${GTEST_DIR}  # Generate native build scripts.

Если вы хотите создать образцы Google Test, вы должны заменить последнюю команду на

cmake -Dgtest_build_samples=ON ${GTEST_DIR}
person Lincoln Yesire    schedule 09.01.2021

В качестве альтернативы также можно собрать googletest, используя обычную команду MSYS/Mingw.

Итак, вот мой альтернативный способ:

  1. Убедитесь, что MSys/MingW установлен в вашей Windows и для него задана среда PATH.

  2. Откройте окно cmd — здесь вы также можете явно указать PATH

  3. компакт-диск в разархивированный каталог googletest

  4. Вызовите configure с помощью sh (часть MSys): sh configure

  5. Вызов make -> libgtest.a должен быть построен. Он находится в подкаталоге lib/.libs вашего каталога googletest-directory.

  6. См. README googletest о том, как интегрировать libgtest.a в вашу систему. Также см. руководство по компиляции googletest в вики googletest. В качестве альтернативы укажите путь к библиотеке для gcc -L<googleTestDir>/lib/.libs и добавьте -lgtest для связи с исполняемым файлом вашего тестового проекта.

  7. При использовании макроса ASSERT_DEATH для проверки утверждений в тестируемом коде (имеются в виду утверждения в вашей библиотеке или приложении, а не в googletest), вызовите SetErrorMode — пример main:

    #include <windows.h>
    #include "gtest/gtest.h"
    
    int main (int argc, char** argv)
    {
        // this prevents annoying error message boxes popping up
        // when assert is called in your program code
        SetErrorMode(SEM_NOGPFAULTERRORBOX);
        ::testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
    }
    
person michael_s    schedule 17.06.2014

Вам не нужно копировать двоичные файлы, если они есть на вашем пути. Установите питон и CMake. Протестируйте их в своем msys (консоль MinGW)

which cmake
which python

Если вы видите путь, значит у вас есть бинарники. Если нет, добавьте их путь к своим переменным среды> PATH или просто обновите в msys (при необходимости обновите пути установки)

export PATH=$PATH:/c/Program Files (x86)/CMake/bin/cmake.exe:/c/Python27/python.exe

Затем вы можете построить, как было предложено:

cd xxx/gtest-x.x.x
cmake -G "MSYS Makefiles"
make

Проверьте, все ли работает:

cd make
make
./sample1_unittest.exe
person Halil Kaskavalci    schedule 27.02.2015

Вопрос был задан в 2011 году, и в том же году был дан ответ, набравший наибольшее количество голосов. Таким образом, свежий ответ повысит эффективность вопроса.

Инструменты, которые вам нужны и которые я протестировал:

Mingw64 8.0.2

Ветка исходного кода GoogleTest GitHUb 1.10.0

CMake 3.20.4

и Windows10

Шаги

  • Установите mingw64, дважды щелкнув и выбрав путь, в котором нет пробела между именами каталогов, например. Файлы программ

  • Откройте настройки окон, затем найдите переменные среды и откройте диалоговое окно, чтобы изменить переменную среды Path.

  • Добавьте имя каталога mingw64/bin в переменную среды пути Windows, например. C:\Users[ИМЯ ПОЛЬЗОВАТЕЛЯ]\mingw64\bin (замените [ИМЯ ПОЛЬЗОВАТЕЛЯ] своим именем пользователя, например, Michael или Lee и т. д.)

  • Установите CMake. Это процедура установки двойным щелчком мыши. Убедитесь, что путь к каталогу bin добавлен в переменную среды Path. Он будет установлен в C:/Program Files/...

  • Загрузите репозиторий GoogleTest, извлеките его и создайте каталог сборки внутри извлеченного каталога.

  • Выполните следующие команды

    $ сборка компакт-диска

    $ cmake .. -G Makefiles MinGW

    $ mingw32-make.exe

  • Скопируйте четыре статические библиотеки (*.a) из каталога сборки.

[пример: C:\Users[ИМЯ ПОЛЬЗОВАТЕЛЯ]\sourcecodes\googletest-master\build\lib]

в библиотеку MingW64

[пример: C:\Users[ИМЯ ПОЛЬЗОВАТЕЛЯ]\mingw64\x86_64-w64-mingw32\lib]

  • Перейдите к извлеченному репозиторию GoogleTest, перейдите к

[например, C:\Users[ИМЯ ПОЛЬЗОВАТЕЛЯ]\sourcecodes\googletest-master\googletest\include\gtest]

Скопируйте весь этот каталог gtest и скопируйте в папку

C:\Users[ИМЯ ПОЛЬЗОВАТЕЛЯ]\mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\include

Вы готовы идти. Вы можете собрать и связать Googltest со своим проектом C++. Я также вставляю образец CMakelists.txt

cmake_minimum_required(VERSION 3.12)

project(ProjectName VERSION 1.0.0 LANGUAGES CXX)
    
include_directories(include)

set(SOURCES src/library.cpp include/library.h)
add_executable(libabc ${SOURCES})

#############
## Testing ##
#############

enable_testing()
find_library(GTest gtest)

add_executable (unitTest test/unit_test.cpp)
target_link_libraries (unitTest gtest gtest_main)
add_test(AllFactTest unitTest)

Надеюсь, это сработает.

person TonyParker    schedule 23.06.2021