如何在Windows上使用Mingw和Msys编译Googletest?

14
我的需求很简单。我需要在Windows上使用MinGW和msys编译并使用googletest。是否有任何人有这方面的经验?
谢谢回答。

请描述发生了什么问题。 - Jonas Bötel
我已经取得了一些进展。看起来它需要一个我没有的Python才能安装。我正在尝试解决这个问题。 - Rusty Horse
7个回答

16

我花了一些时间才找到解决方法。这里提供给任何遇到相同问题的人的指南。

要在Windows上编译GoogleTest,请按照以下说明进行操作:

  1. 假设您已经安装了MinGW和MSYS。

  2. 从官方网站http://www.cmake.org/下载并安装CMake。使用Win32安装程序版本。完成安装过程后,将可执行文件从“xxx/CMake/bin”复制到“xxx/MinWG/bin”。

  3. http://www.python.org/下载并安装Python。同样,Windows安装程序可以胜任。完成安装过程后,将python文件夹中的“python.exe”复制到“xxx/MinWG/bin”。

  4. http://code.google.com/p/googletest/下载最新的稳定版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的lib目录中。

  8. 在编译测试时,向gcc添加"-lgtest"参数。

编辑 评论者是正确的。虽然在我的情况下复制可执行文件有效,但通常不是一个好习惯。请尝试使用符号链接代替。


为什么要复制而不是使用符号链接来处理这些可执行文件? - mbx
实际上,CMake和Python都没有静态构建,因此当从msys shell调用它们时,两者都无法工作(崩溃和无限循环)。 - mbx
将 include 文件夹 "xxx/gtest-x.x.x/include" 复制到 你的 MinGW gcc include。将库文件 "xxx/gtest-x.x.x/*.a" 复制到 你的 MinGW gcc lib 中。看起来这对我不起作用。你能否请告诉我完整的路径? - John

3

这个问题是在2011年提出的,获得最多投票的答案也是在同一年回答的。因此,一个新鲜的答案将提高问题的有效性。

你需要的工具和我测试过的:

Mingw64 8.0.2

GoogleTest GitHUb源代码仓库分支1.10.0

CMake 3.20.4

以及Windows10

步骤:

  • 通过双击安装mingw64,并选择目录名称之间没有空格的路径,例如“Program Files”

  • 打开Windows设置,然后搜索环境变量并打开对话框以编辑Path环境变量

  • 在Windows Path环境变量中添加mingw64 / bin目录名称,例如C:\Users[USERNAME]\mingw64\bin(将[USERNAME]替换为您的用户名,例如Michael或Lee等)

  • 安装CMake。它是双击安装过程。确保其bin目录路径已添加到Path环境变量中。它将安装在C:/Program Files/...

  • 下载GoogleTest repo并解压缩,然后在提取的目录中创建一个build目录。

  • 执行以下命令

    $ cd build

    $ cmake .. -G "MinGW Makefiles"

    $ mingw32-make.exe

  • 从build目录中复制四个静态库(*.a)

[例如:C:\Users[USERNAME]\sourcecodes\googletest-master\build\lib]

拷贝到MingW64的lib文件夹中

[例如:C:\Users[USERNAME]\mingw64\x86_64-w64-mingw32\lib]

  • 进入GoogleTest提取的repo,导航到

[例如C:\Users[USERNAME]\sourcecodes\googletest-master\googletest\include\gtest]

将整个gtest目录复制到文件夹中

C:\Users[USERNAME]\mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\include

你已经准备就绪,可以将Google Test与你的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)

我希望它能够正常工作。


这对我很有帮助。只是不要忘记添加`target_link_libraries (unitTest gtest gtest_main)` 像我一样。否则编译器找不到二进制文件。 - Chen Peleg

3
使用mingw make构建libgtest.a,无需使用cmake/python。现在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文件夹,然后按照相同的步骤操作即可。

谢谢@jesper-matthiesen,它起作用了。如果有人遇到ld.exe找不到lpthread的错误,请尝试运行mingw-get install libpthreadgc-dev,如链接中所述。谢谢。 - v.c
我看不到确实有一个名为 googletest\make 的文件夹。 - John

2

https://github.com/google/googletest/tree/master/googletest的README中: 在将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}

1
作为另一种选择,也可以使用常规的MSYS/Mingw制作来构建googletest。
因此,这是我提供的另一种方法:
  1. 确保在Windows上安装了MSys/MingW,并设置了PATH环境变量

  2. 打开cmd窗口 - 您也可以在此处显式设置PATH

  3. 切换到解压后的googletest目录

  4. 使用sh(MSys的一部分)调用configure:sh configure

  5. 调用make -> 应该已经构建了libgtest.a。它位于您的googletest目录下的lib/.libs子目录中

  6. 请参阅googletest的README以了解如何将libgtest.a集成到您的系统中。还可以在googletest wiki中查看googletest primer以了解如何编译。或者为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)
    {
        // 这可以防止在调用程序代码中调用assert时出现烦人的错误消息框
        SetErrorMode(SEM_NOGPFAULTERRORBOX);
        ::testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
    }
    

1
只要将二进制文件放在路径上,就不需要复制它们。安装Python 和 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

0

使用MSYS2,只需安装mingw-w64-x86_64-gtest软件包:

pacman -S mingw-w64-x86_64-gtest

然后使用标志 -lgtest -lgtest_main 编译测试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接