这段时间看了些cmake构建的一些规则,正巧项目中需要用到单元测试,这里就用cmake构建googletest框架(单元测试)来进行测试。正好也复习一下cmake构建规则。
这里进行cmake构建的时候采用的是引入本地第三方库的方式进行构建,一般常规构建大都采用
将第三方库源文件fetch到本地项目的third_party目录下进行整体项目的引入构建。
我这里采用先将第三方源码编译安装后,引入到本地需要的项目中去的方式构建。
首先,这里先下载googletest的源代码,这里采用的是1.10.0版本:
wget https://github.com/google/googletest/archive/refs/tags/release-1.10.0.tar.gz
这里简单记录下googletest构建的过程
1.解压源码
tar -zxvf release-1.10.0.tar.gz
这里我将源码解压到$HOME/app目录下了
2.cmake构建,当然也可以使用bazel,不过这里我采用cmake进行外部构建,这里需要指定两个构建参数,一个是BUILD_SHARED_LIBS=ON 设置为编译成动态链接库(googletest默认是使用的静态链接库 ,可能跟版本有关,这里不用太纠结),另一个是安装目录编译参数CMAKE_INSTALL_PREFIX设置为安装的路径地址(这里安装在$HOME/app/googletest-build-release-1.10)
mkdir -p $HOME/app/googletest-build-release-1.10
mkdir build && cd build
cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=$HOME/app/googletest-build-release-1.10 ..
3.编译&&安装
make -j && make install
安装完成后,可以看到大概如下图所示的状态:
至此 googletest编译安装完成!
下面就要在需要googletest的项目中引入googletest了。
我这里的项目目录为M-unit-test
目录结构很简单:
src下是源代码,CMakeLists.txt是构建规则,build下是构建过程生成的一些中间文件和最终的可执行文件
unit_tests.cpp代码为:
#include <gtest/gtest.h>
// Demonstrate some basic assertions.
TEST(HelloTest, BasicAssertions) {
// Expect two strings not to be equal.
EXPECT_STRNE("hello", "world");
// Expect equality.
EXPECT_EQ(7 * 6, 42);
}
CMakeLists.txt内容为:
cmake_minimum_required(VERSION 3.5)
set(CMAKE_C_COMPILER "/home/wzy/app/gcc-9.5.0-build/bin/gcc")
set(CMAKE_CXX_COMPILER "/home/wzy/app/gcc-9.5.0-build/bin/g++")
# Set the project name
project (google_test_example)
#############################################
# Unit tests
# enable CTest testing
enable_testing()
# include_directories("/home/wzy/app/googletest-build-release-1.10/include")
# get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
# message("include_dirs: ${dir}")
# Add a testing executable
add_executable(unit_tests src/unit_tests.cpp)
#compiler with the -I flag eg. -I/directory/path
target_include_directories(unit_tests PUBLIC "/home/wzy/app/googletest-build-release-1.10/include")
# 打印指定的头文件搜索路径
get_property(public_private_dirs TARGET unit_tests PROPERTY INCLUDE_DIRECTORIES)
message("public_private_dirs: ${public_private_dirs}")
#find libgtest.so library
find_library(GTEST
gtest
"/home/wzy/app/googletest-build-release-1.10/lib64" )
find_library(GTEST_MAIN
gtest_main
"/home/wzy/app/googletest-build-release-1.10/lib64" )
IF (NOT GTEST)
MESSGAGE(FATAL_ERROR "libgtest.so not found")
ENDIF(NOT GTEST)
IF (NOT GTEST_MAIN)
MESSGAGE(FATAL_ERROR "libgtest_main.so not found")
ENDIF(NOT GTEST_MAIN)
message(STATUS " gtest path : " ${GTEST})
message(STATUS " gtest_main path : " ${GTEST_MAIN})
target_link_libraries(unit_tests
${GTEST}
${GTEST_MAIN}
)
#To add a test you call the add_test() function. This will create a named test which will run the supplied command.
add_test(test_all unit_tests)
通过enable_testing() 开启ctest 测试。
其他的都标注有注释,还算清楚,这里就不一一解释了。
这里gtest的库文件路径和头文件路径都是第一步安装的路径。
接下来就是构建和编译执行了
# 构建
cmake -B build
# 编译
cmake --build build
# 执行测试用例
./build/unit_tests
最终结果为:
至此,cmake引入本地项目外的代码库进行单元测试就已经完成了!
可以看到这里采用的构建使用的是动态链接的方式