https://github.com/google/googletest/blob/master/googletest/README.md
构建方法
设置
要构建GoogleTest或者使用它作自己的测试,你需要告诉编译系统去哪里找它的头文件和源文件。具体方式取决于你使用的编译系统。
用CMake编译
GoogleTest 附带了一个CMake构建脚本(CMakeLists.txt)可以在多种平台上使用,如果没有安装CMake,可以从http://www.cmake.org/免费下载。
Cmake通过生成本地mikefiles或者构建项目方式工作,他们可以在你选择的编译环境中使用。你可以将GoogleTest作为一个独立项目构建,也可以将其并入另一个现有项目的CMake中构建。
构建独立CMake项目
当将GoogleTest作为一个独立项目构建时,使用以下命令:
git clone https://github.com/google/googletest.git -b release-1.10.0
cd googletest # Main directory of the cloned repository.
mkdir build # Create a directory to hold the build output.
cd build
cmake .. # Generate native build scripts for GoogleTest.
上面的命令默认包含GoogleMock,如果只想构建GoogleTest只须将上面命令的最后一行替换为:
cmake .. -DBUILD_GMOCK=OFF
ps:看一下googletest目录下的CMakeLists.txt就知道,配置BUILD_GMOCK默认为ON,此时会构建googlemock文件加,否则构建googletest文件夹。
如果你在类unix上,此时你可以在当前文件夹(也就是build文件夹)内看到Makefile文件。然后输入make命令构建GoogldTest,再以root身份安装(默认安装在/usr/local文件夹下):
make
sudo make install
window和mac不熟(>_<!!!).
并入现有的CMake项目中构建
如果你想在现有的某个用CMake管理的项目中使用GoogleTest,最简单的方法是获得安装的头文件和库文件。
- 使用find_package(或者pkg_check_modules)倒入GoogleTest。例如:如果find_package(GTest CONFIG REQUIRED) 成功的话,就可以以GTest::gtest或GTest::gmock方式使用GoogleTest。
而一种更加稳健和灵活的方式是将GoogleTest作为该项目的一部分构建。通过使用CMake的add_subdirectory()命令可以将GoogleTest的源代码提供给main build。优点是使用相同的编译器和连接器,避免了GoogleTest和你的项目使用不兼容库的问题。将GoogleTest提供给main build有以下几种方式。
- 手动下载GoogleTest源码,并将其放到一个已知的位置。这是最不灵活的方法,并且很难和持续的集成系统一起使用(This is the least flexible approach and can make it more difficult to use with continuous integration systems)
- 将GoogleTest的源码拷贝到主项目的源代码树中。这是最简单的方法,但是最难保持GoogleTest更新。
- 将GoogleTest作为一个git子模块或等同模块添加到项目中。(本人公司项目管理使用的是svn(>_<!!!))
- 使用CMake下载GoogleTest作为构建项目的一部分。
上述最后一种方法是用在一个独立文件(例如CMakeLists.txt.in)中的一小段CMake代码实现的。他会被复制到构建区,而后在CMake期间作为一个子构建被调用。这个目录会被add_subdirectory()拉到子构建中被调用。例如:
CMakeLists.txt.in文件内容:
cmake_minimum_required(VERSION 2.8.12)
project(googletest-download NONE)
inlcude(ExternalProject)
ExternalProject_Add(googletest
GIT_PEPOSITORY https://github.com/google/googletest.git
GIT_TAG master
SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-src"
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
TEST_COMMAND ""
现有的CMakeListst.txt:
# Download and unpack googletest at configure time
configure_file(CMakeLists.txt.in googletest-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download )
if(result)
message(FATAL_ERROR "CMake step for googletest failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
RESULT_VARIABLE result
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googletest-download )
if(result)
message(FATAL_ERROR "Build step for googletest failed: ${result}")
endif()
# Prevent overriding the parent project's compiler/linker
# settings on Windows
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# Add googletest directly to our build. This defines
# the gtest and gtest_main targets.
add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src
${CMAKE_CURRENT_BINARY_DIR}/googletest-build
EXCLUDE_FROM_ALL)
# Now simply link against gtest or gtest_main as needed. Eg
add_executable(example example.cpp)
target_link_libraries(example gtest_main)
add_test(NAME example_test COMMAND example)
上面的方式由于使用了ExternalProject_Add()命令,所以需要CMake的版本必须是2.8.2或更后
Visual Studio
pass (对windows开发环境不熟)
C++标准版本
构建GoogleTest需要支持C++11环境,一种方式是在顶层项目中指定C++11,例如使用set(CMAKE_CXX_STANDARD 11)命令。如果这种方式不可行,例如在一个C项目中使用GoogleTest作验证,可以通过添加DCMAKE_CXX_FLAGS选项将其添加到CMake选项中来指定。
调整GoogleTest
GoogleTest可以被用于不同的环境中。但是默认配置在某些环境中可能无法正常工作(或不能很好的工作)。你可以方便的在编译器命令行中定义控制宏,大体上,这些宏的名字类似于GTEST_XYZ
然后你可以通过将他们定义成1或0来启用或禁用某个功能。
我们在下面的文件列表中详细列出了这些宏 include/gtest/internal/gtest-port.h
多线程测试
GoogleTest在有pthread库的时候是线程安全的,在#include "gtest/gtest.h"
后你可以检测GTEST_IS_THREADSAFE
宏看是否是线程安全的(如果是1则是安全的,否则是不安全的)。
如果GoogleTest没有检测到在你的环境下是否是线程安全的,你可以强制设置:
-DGTEST_HAS_PTHREAD=1
或者
-DGTEST_HAS_PTHREAD=0
当GoogleTest使用pthread的时候你必须在编译器或连接器中选择pthread库,否则会得到连接错。如果你使用的是CMake脚本,这个问题已经被解决了,如果使用的是自己的构建脚本,你必须读你的编译或连接器手册来确定添加什么标志。
作为共享库(DLL)
GoogleTest结构紧凑,所以大多数使用者将其作为静态库进行构建和连接。你也可以将其用作为共享库(Windows称为DLL)
为了将gtest编译为共享库,添加{}到编译器标志。
-DGTEST_CREATE_SHARED_LIBRARY=1
你还需要告诉连接器生成一个共享库-参考连接器手册。
要编译使用gtest共享库的测试,需要添加{}到编译器标志。
-DGTEST_LINKED_AS_SHARED_LIBRARY=1
注意:
避免宏观名冲突
在C++中宏不服从命名空间。因此两个库中同时定义了相同名字的宏,且被同时#include
的时候就会命名冲突。如果GoogleTest的宏和其他库的宏命名冲突时你可以重命名GoogleTest的宏,来避免冲突。
具体而言:如果GoogleTest和其他库都定义了FOO宏,你可以添加:
-DGTEST_DONOT_DEFINE_FOO=1
到编译器标志来告诉GoogleTest将FOO宏的名字重新命名成GTEST_FOO.目前FOO可以是SUCCEED,FAIL或者TEST.例如在-DTEST_DONT_DEFINE_TEST=1
情况下,为了定义一个test你需要写:
GTEST_TEST(SomeTest, DoesThis) {...}
而非
TEST(SomeTest, DoesThis) {...}