Versions
- Windows 7
- MSVC 11 (Visual Studio 2012)
- CMake 3.0
- gtest 1.7.0
Google Test
Assume we placed unzipped gtest source in %GTEST_ROOT%
. To get gtest-1.7.0 compiled with MSVC11, edit %GTEST_ROOT%\cmake\internal_utils.cmake
.
macro(fix_default_compiler_settings_)$
if (MSVC)$
add_definitions( -D_VARIADIC_MAX=10 ) # Add this line
# ...
endif()
endmacro()
Note: You won’t need the workaround with MSVC12, or VS2013 (I envy you).
Open up “Developer Command Prompt for VS2012” (yeah, I LOVE cmdline) and type:
# Compile
cd %GTEST_ROOT%
mkdir build
cd build
cmake .. -G "NMake Makefiles"
# Install with prefix "c:\opt" (change it to whatever you like)
mkdir c:\opt\lib
mkdir c:\opt\include
xcopy *.lib c:\opt\lib
cd ..
xcopy include\gtest c:\opt\include\
Note: I actually did files/dirs copying in cygwin and welcome feedback for correction.
CMake
Let’s write a CMakeLists.txt
for a gtest sample. I picked the sample2
in gtests source repo. You can find it in the %GTEST_ROOT%/samples
or here.
The sample 2 involves files:
sample2.cc
sample2.h
sample2_unittest.cc
Now we add a CMakeLists.txt file of following content in the same folder.
cmake_minimum_required(VERSION 3.0)
project(gtestexp)
add_definitions( -D_VARIADIC_MAX=10 )
if(MSVC)
# We statically link to reduce dependancies
foreach(flag_var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
if(${flag_var} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
endif(${flag_var} MATCHES "/MD")
if(${flag_var} MATCHES "/MDd")
string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}")
endif(${flag_var} MATCHES "/MDd")
endforeach(flag_var)
endif(MSVC)
include_directories( c:/opt/include )
link_directories ( c:/opt/lib )
add_executable(unit sample2_test.cc sample2.cc)
target_link_libraries(unit gtest gtest_main)
The if(MSVC) ... endif(MSVC)
block in above script forces static linkage of our executable (unit). Otherwise the default dynamic linkage is applied and would causes link error since gtest is built as static libs.
After all, again with “Developer Command Prompt for VS2012”.
mkdir build
cmake .. -G "NMake Makefiles"
nmake
unit.exe
Then you’re done with following test results.
[==========] Running 4 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 4 tests from MyString
[ RUN ] MyString.DefaultConstructor
[ OK ] MyString.DefaultConstructor (0 ms)
[ RUN ] MyString.ConstructorFromCString
[ OK ] MyString.ConstructorFromCString (0 ms)
[ RUN ] MyString.CopyConstructor
[ OK ] MyString.CopyConstructor (0 ms)
[ RUN ] MyString.Set
[ OK ] MyString.Set (0 ms)
[----------] 4 tests from MyString (15 ms total)
[----------] Global test environment tear-down
[==========] 4 tests from 1 test case ran. (15 ms total)
[ PASSED ] 4 tests.
You can also generate xUnit compatible XML report with --gtest_output
option. i.e.
unit.exe --gtest_output=xml:unit.xml
Report content:
<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="4" failures="0" disabled="0" errors="0" timestamp="2014-12-17T01:21:55" time="0.016" name="AllTests">
<testsuite name="MyString" tests="4" failures="0" disabled="0" errors="0" time="0.016">
<testcase name="DefaultConstructor" status="run" time="0" classname="MyString" />
<testcase name="ConstructorFromCString" status="run" time="0" classname="MyString" />
<testcase name="CopyConstructor" status="run" time="0" classname="MyString" />
<testcase name="Set" status="run" time="0" classname="MyString" />
</testsuite>
</testsuites>
Written with StackEdit.
留言
張貼留言