C语言开发之CMakeLists以及gtest测试在C语言中的使用方法(其四)

"本文介绍了如何在C语言项目中利用gtest进行单元测试。通过将C语言代码打包成静态库,并在外部创建gtest测试文件,结合C++的extern "C"来调用C语言函数。详细展示了项目目录结构、关键代码片段以及CMakeLists配置,最终成功运行并展示gtest测试结果。"

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建议在C语言开发之CMakeLists(其三)中看一下代码结构,下面的内容仅仅涉及gtest测试C语言项目的方法。

具体思路

gtest可以用于C++的测试,无法直接应用到C语言项目中。我们不妨将C语言项目打包成静态库,在C语言项目外单独建立gtest测试文件。

extern

为了使C++调用C语言项目,需要在头文件部分添加extern “c”,告诉c++这是C语言程序。
项目目录结构如下:

  |--test
   |   |--gtest.cpp
   |   |--alg
   |   |   |--CMakeLists.txt
   |   |   |--ut_alg.cpp
   |   |   |--st_alg.cpp
   |   |--CMakeLists.txt
   |--algprj
   |   |--alg
   |   |   |--add
   |   |   |   |--add.c
   |   |   |   |--CMakeLists.txt
   |   |   |--sub
   |   |   |   |--sub.c
   |   |   |   |--CMakeLists.txt
   |   |   |--CMakeLists.txt
   |   |   |--utils
   |   |   |   |--alg_template.h
   |   |--examples
   |   |   |--add_example.c
   |   |   |--sub_example.c
   |   |   |--CMakeLists.txt
   |   |--include
   |   |   |--alg.h
   |   |--CMakeLists.txt
   |   |--lib
   |   |   |--libalg.a
   |   |--output    //注意:output为make install之后产生的文件。
   |   |   |--include
   |   |   |   |--alg.h
   |   |   |--lib
   |   |   |   |--libalg.a

其中test为gtest模块,algprj为C语言项目模块,其它未涉及的具体代码见C语言开发之CMakeLists(其三)
为alg.h与alg/utils/alg_template.h分别添加extern,如下
alg.h

#ifndef __ALG_H
#define __ALG_H

#ifdef __cplusplus
extern "C" {
#endif

float my_sub32(float a, float b);
float my_add32(float a, float b);
double my_sub64(double a, double b);
double my_add64(double a, double b);

#ifdef __cplusplus
}
#endif

#endif

alg/utils/alg_template.h

#ifndef __ALG_TEMPLATE_H
#define __ALG_TEMPLATE_H

#ifdef __cplusplus
extern "C" {
#endif

#ifdef ALG32
    #define FLOAT float
    #define DT(func) func##32
#endif
#ifdef ALG64
    #define FLOAT double
    #define DT(func) func##64
#endif

#ifdef __cplusplus
}
#endif

#endif

test/gtest.cpp

#include "gtest/gtest.h"

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

test/alg/ut_alg.cpp,my_add32为C语言项目中的函数

#include<iostream>
#include "alg.h"
#include "gtest/gtest.h"
using namespace std;

TEST(add, utadd32) {
    float a = 1, b = 2;
    float c = my_add32(a, b);
    ASSERT_EQ(c, 3.0);
}

TEST(add, utadd64) {
    double a = 1, b = 2;
    double c = my_add64(a, b);
    ASSERT_EQ(c, 3.0);
}

test/alg/st_alg.cpp

#include<iostream>
#include "alg.h"
#include "gtest/gtest.h"
using namespace std;

TEST(sub, stsub32) {
    float a = 2, b = 1;
    float c = my_sub32(a, b);
    ASSERT_EQ(c, 1.0);
}

TEST(sub, stsub64) {
    double a = 1, b = 2;
    double c = my_sub64(a, b);
    ASSERT_EQ(c, -1.0);
}

test/CMakeLists.txt

#老三段
cmake_minimum_required(VERSION 2.8)
project(alg_gtest CXX)
#为了使用gtest,指定c++语言,为c++11版本
set(CMAKE_CXX_STANDARD 11)
#include与link目录为我们cmake ,make ,make install之后产生的头文件与静态库,具体见[C语言开发之CMakeLists(其三)]
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../algprj/output/include)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../algprj/output/lib)
#这里是新的用法,寻找OpenMP包
FIND_PACKAGE(OpenMP REQUIRED)
if(OPENMP_FOUND)
    message("OPENMP FOUND")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()

set(MODULES
    alg
)

foreach(module ${MODULES})
    add_subdirectory(${module})
endforeach()  

add_executable(alg_gtest ${TEST_SRCS} gtest.cpp)
#gtest为gtest相关的库,alg为自己C语言项目的库
target_link_libraries(alg_gtest alg gtest)

test/alg/CMakeLists.txt

set(TEST_SOURCES
    alg/ut_alg.cpp
    alg/st_alg.cpp
)

set(TEST_SRCS ${TEST_SRCS} ${TEST_SOURCES} PARENT_SCOPE)

编译运行,查看gtest测试结果:

[==========] Running 4 tests from 2 test suites.
[----------] Global test environment set-up.
[----------] 2 tests from add
[ RUN      ] add.utadd32
[       OK ] add.utadd32 (0 ms)
[ RUN      ] add.utadd64
[       OK ] add.utadd64 (0 ms)
[----------] 2 tests from add (0 ms total)

[----------] 2 tests from sub
[ RUN      ] sub.stsub32
[       OK ] sub.stsub32 (0 ms)
[ RUN      ] sub.stsub64
[       OK ] sub.stsub64 (0 ms)
[----------] 2 tests from sub (0 ms total)

[----------] Global test environment tear-down
[==========] 4 tests from 2 test suites ran. (0 ms total)
[  PASSED  ] 4 tests.

传送门

FIND_PACKAGE详解
C语言开发之CMakeLists以及gtest测试在C语言中的使用方法(其四)
C语言开发之CMakeList(其三)
C/C++开发之CMakeList(其二)
C/C++开发之CMakeLists(其一)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值