当前位置: 首页 > article >正文

Windows 下搭建 googletest 测试框架(C/C++)

引用该篇文章:

  • https://www.cnblogs.com/augustine0654/p/17156412.html

实际复现时发现了一些问题,故记录下:

1. 使用 gcc 编译 exe 时,mian.c 文件位置是在 calculate 里

命令:

 gcc ./src/calculate/main.c ./src/calculate/add.c -I ./src/calculate/include -o calculate.exe

效果:

PS D:\gtest_project\win-googletest> gcc ./src/calculate/main.c ./src/calculate/add.c -I ./src/calculate/include -o calculate.exe
PS D:\gtest_project\win-googletest> .\calculate.exe
a+b= 7

2. `cmake -G "MinGW Makefiles" ..`  时可能出现找不到 GNU,需要显式指定 MinGW 编译器

命令:

cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=C:/msys64/mingw64/bin/gcc.exe -DCMAKE_CXX_COMPILER=C:/msys64/mingw64/bin/g++.exe ..

效果:

PS D:\gtest_project\win-googletest\build> cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=C:/msys64/mingw64/bin/gcc.exe -DCMAKE_CXX_COMPILER=C:/msys64/mingw64/bin/g++.exe ..
-- Configuring done (0.1s)
-- Generating done (0.0s)
-- Build files have been written to: D:/gtest_project/win-googletest/build
PS D:\gtest_project\win-googletest\build> .\calculate.exe
a+b= 7

3. 主程序的 CMakeLists.txt 中 main.c 路径有问题,与第一个问题应该是一样的

cmake_minimum_required(VERSION 3.0)  # cmake -G "MinGW Makefiles" ..
project(GTESTWIN)

# 头文件目录
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src/calculate/include")
# 源文件目录
AUX_SOURCE_DIRECTORY("${CMAKE_CURRENT_SOURCE_DIR}/src/calculate" DIR_SRCS)

# 生成可执行文件
add_executable(calculate ./src/calculate/main.c ${DIR_SRCS})

4. 后续 googletest 库安装和使用都与教程一样,没有问题

#include "gtest/gtest.h"
#include "gmock/gmock.h"

// extern "C"{
#include "add.h"
// }


TEST(ARRAY_TEST, calculate_test) {
    int a=3,b=4;
    EXPECT_EQ(7, add(a, b));
}

#if 1
int main(int argc, char *argv[])
{
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
#endif

这边与说的问题一样,需要注释掉 extern "C"

【如果出现未定义错误,需要将测试代码中 extern { 以及 } 这两行注释掉,只保留 #include "add.h" ,原因能是 cpp 和 c 混合编译导致的】

效果:

PS D:\gtest_project\win-googletest\unittest\testcase\calculate_test\build> cmake -G "MinGW Makefiles" -DCMAKE_C_COMPILER=C:/msys64/mingw64/bin/gcc.exe -DCMAKE_CXX_COMPILER=C:/msys64/mingw64/bin/g++.exe ..
-- The C compiler identification is GNU 13.1.0
-- The CXX compiler identification is GNU 13.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/msys64/mingw64/bin/gcc.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/msys64/mingw64/bin/g++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (1.7s)
-- Generating done (0.0s)
-- Build files have been written to: D:/gtest_project/win-googletest/unittest/testcase/calculate_test/build
PS D:\gtest_project\win-googletest\unittest\testcase\calculate_test\build> mingw32-make
[ 33%] Building C object CMakeFiles/calculate_test.dir/D_/gtest_project/win-googletest/src/calculate/add.c.obj
[ 66%] Building CXX object CMakeFiles/calculate_test.dir/calculate_test.cpp.obj
[100%] Linking CXX executable calculate_test.exe
[100%] Built target calculate_test
PS D:\gtest_project\win-googletest\unittest\testcase\calculate_test\build> .\calculate_test.exe
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from ARRAY_TEST
[ RUN      ] ARRAY_TEST.calculate_test
[       OK ] ARRAY_TEST.calculate_test (0 ms)
[----------] 1 test from ARRAY_TEST (3 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (12 ms total)
[  PASSED  ] 1 test.
PS D:\gtest_project\win-googletest\unittest\testcase\calculate_test\build> cd ..
PS D:\gtest_project\win-googletest\unittest\testcase\calculate_test> g++ calculate_test.cpp ../../../src/calculate/add.c ../../googletest/lib/libgtest.a -I ../../../src/calculate/include -I ../../googletest/googletest/include -I ../../googletest/googlemock/include -o calculate_test.exe
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\SUNJIN~1\AppData\Local\Temp\cc5B9OiW.o:calculate_test:(.text+0x26): undefined reference to `add'
collect2.exe: error: ld returned 1 exit status
PS D:\gtest_project\win-googletest\unittest\testcase\calculate_test> g++ calculate_test.cpp ../../../src/calculate/add.c ../../googletest/lib/libgtest.a -I ../../../src/calculate/include -I ../../googletest/googletest/include -I ../../googletest/googlemock/include -o calculate_test.exe
PS D:\gtest_project\win-googletest\unittest\testcase\calculate_test> .\calculate_test.cpp
PS D:\gtest_project\win-googletest\unittest\testcase\calculate_test> .\calculate_test.exe
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from ARRAY_TEST
[ RUN      ] ARRAY_TEST.calculate_test
[       OK ] ARRAY_TEST.calculate_test (0 ms)
[----------] 1 test from ARRAY_TEST (3 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (13 ms total)
[  PASSED  ] 1 test.

5. 我将项目推到了 github 上,方便其他人学习

地址:https://github.com/Strive-Sun/win-googletest.git

main 分支剔除了 build 文件夹,master 分支包含了 build 文件夹

补充创建远程仓库过程:

1. 在 github 上 Create a new repository,生成新仓库地址
2. git init . #默认在 master 分支上
3. git add .
4. git commit -m "Init Project"
5. git remote add origin https://github.com/Strive-Sun/win-googletest
6. git push --set-upstream origin master
7. git checkout main
#将 master 分支合并到 main 分支上
#对于没有共同的祖先,一般新仓库在 merge 时容易出现合并失败问题
#需要添加 --allow-unrelated-histoires 参数
8. git merge master --allow-unrelated-histories
#添加 .gitignore 文件,剔除 build 文件夹
9. git commit -m "Add .gitignore file"
#在 .gitignore 里添加了 build,但项目中的 build 文件夹却没被忽略,这通常是因为该文件夹之前已经被 Git 追踪了,需要停止追踪 build 文件夹,如下命令
10. git rm -r --cached build
11. git commit -m "Stop tracking build folder"
12. git push

6. 补充了算法分支,注意如果使用 .cpp 文件而不是 .c 文件时,需要删除 extern "C" 声明,不然会提示找不到函数定义

如下错误所示:

PS D:\gtest_project\win-googletest\unittest\testcase\quicksort_test\build> mingw32-make
[ 33%] Building CXX object CMakeFiles/quicksort_test.dir/quicksort_test.cpp.obj
[ 66%] Linking CXX executable quicksort_test.exe
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: CMakeFiles\quicksort_test.dir/objects.a(quicksort_test.cpp.obj):quicksort_test:(.text+0x15f): undefined reference to `quicksort'
collect2.exe: error: ld returned 1 exit status
mingw32-make[2]: *** [CMakeFiles\quicksort_test.dir\build.make:120: quicksort_test.exe] Error 1
mingw32-make[1]: *** [CMakeFiles\Makefile2:82: CMakeFiles/quicksort_test.dir/all] Error 2
mingw32-make: *** [Makefile:90: all] Error 2

删除 extern "C"

// extern "C" {
#include "quicksort.h"
// }


http://www.kler.cn/a/539862.html

相关文章:

  • 移动(新)魔百盒刷机教程[M301A_YS]
  • 机器学习笔记
  • 【Java基础】为什么不支持多重继承?方法重载和方法重写之间区别、Exception 和 Error 区别?
  • [LVGL] 在VC_MFC中移植LVGL
  • FaceFusion如何设置公开链接和端口
  • 2025.1.8(qt图形化界面之消息框)
  • css:怎么设置图片不变形
  • jupyterLab插件开发
  • iOS AES/CBC/CTR加解密以及AES-CMAC
  • go-elasticsearch创建ik索引并进行查询操作
  • Mysql8应用架构
  • 开源身份和访问管理方案之keycloak(一)快速入门
  • CNN-day9-经典神经网络ResNet
  • 如何在React中使用Redux进行状态管理?
  • github release页面的zip和tar.gz有什么区别?
  • linux 中毒 脚本 .system 服务器中毒占用CPU,进程名称.system
  • SQLAlchemy 的内存消耗
  • React 第二十三节 useTransition Hook 的使用注意事项详解
  • Vue笔记(六)
  • verilog练习:i2c slave 模块设计
  • 链表(LinkedList) 1
  • 基于HTML5 Canvas 和 JavaScript 实现的烟花动画效果
  • 2.6 寒假训练营补题
  • oracle-函数-concat(c1,c2)
  • Linux下Gufw防火墙安装指南
  • Java入门与进阶指南