CMake項目中集成gtest

使用cmake的ExternalProject_Add相關(guān)命令,實現(xiàn)源碼獲取、編譯、集成到本地項目中的動態(tài)集成,不需要先安裝gtest,而是直接將gtest編譯到當(dāng)前目錄中,從而解決了項目部署時gtest的依賴問題。
做法參考:
https://github.com/google/googletest/blob/master/googletest/README.md
Googletest的repo上有較為詳細(xì)的介紹,這里簡單梳理下如何加入到自己的項目中。

先列出我的項目目錄結(jié)構(gòu):

.
├── test
│   ├── CMakeLists.txt
│   ├── CMakeLists.txt.in
│   └── unittest
│       ├── CMakeLists.txt
│       └── test.cpp
└── thirdparty
    └── gtest
        └── googletest-release-1.8.0.zip
  1. test項目目錄下,copy下邊的內(nèi)容,并另存為CMakeLists.txt.in
cmake_minimum_required(VERSION 3.1.0)

project(googletest-download NONE)

include(ExternalProject)
ExternalProject_Add(googletest
  URL               ${CMAKE_SOURCE_DIR}/thirdparty/gtest/googletest-release-1.8.0.zip
#  URL               https://github.com/google/googletest/archive/release-1.8.0.zip
  URL_MD5           adfafc8512ab65fd3cf7955ef0100ff5
  SOURCE_DIR        "${CMAKE_CURRENT_BINARY_DIR}/googletest-src"
  BINARY_DIR        "${CMAKE_CURRENT_BINARY_DIR}/googletest-build"
  CONFIGURE_COMMAND ""
  BUILD_COMMAND     ""
  INSTALL_COMMAND   ""
  TEST_COMMAND      ""
)

這里說明下,下載的目錄可以是網(wǎng)絡(luò)鏈接,也可以是本地的一個文件地址,這里為了減少網(wǎng)絡(luò)下載的負(fù)擔(dān)(實際上是為了防止被墻),使用本地的文件。
Googletest推薦是直接從git上clone,沒必要,repo很大的,不如直接下載指定release的源碼。

  1. test項目目錄下,copy下邊的內(nèi)容,另存為CMakeLists.txt
cmake_minimum_required(VERSION 3.1.0)
project(test)

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)

# The gtest/gtest_main targets carry header search path
# dependencies automatically when using CMake 2.8.11 or
# later. Otherwise we have to add them here ourselves.
if (CMAKE_VERSION VERSION_LESS 2.8.11)
  include_directories("${gtest_SOURCE_DIR}/include")
endif()

add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/unittest)
  1. 在unittest目錄下,copy下邊的內(nèi)容,另存為CMakeLists.txt
cmake_minimum_required(VERSION 3.1.0)
project(unittest)

# Now simply link against gtest or gtest_main as needed. 
add_executable(utest test.cpp)
target_link_libraries(utest gtest_main)
enable_testing()
  1. 在unittest目錄下,copy 下邊的內(nèi)容,另存為test.cpp
#include "gtest/gtest.h"
TEST(TestSuiteName, TestName) {
    EXPECT_EQ(1, 1);
}

至此,配置完成,可以在unittest目錄下依賴gtest實現(xiàn)自己的測試用例了。
如何編譯呢?

mkdir build && cd build
cmake .. 
make
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容