Kro*_*oll 2 c++ cmake googletest
我有一个带有子项目测试的主项目.在project/CMakeLists.txt中我添加了
add_subdirectory(tests)
Run Code Online (Sandbox Code Playgroud)
在project/tests/CMakeLists.txt中,我插入了"预编译"gtest库(来自Ubuntu存储库).我cd到/ usr/src/gtest并将两个*.a文件编译到系统lib目录中.它工作正常,直到google test FAQ中出现的问题出现.
如何从project/tests/CMakeLists.txt构建gtest静态库文件以及如何使用这个新的*.a文件而不是系统文件?
我从头开始.首先,从中下载googletest源代码
当我们下载这个ZIP文件时,我们会获得googletest和googlemock项目,但在这里我只会使用googletest文件夹.我解压缩ZIP并将googletest文件夹复制到我的项目中,例如:
/home/name/myProject/
Run Code Online (Sandbox Code Playgroud)
此文件夹中的内容可能如下所示:
- CMakeLists.txt
- googletest /
- main.cpp
Run Code Online (Sandbox Code Playgroud)
在CMakeList文件中,我可以添加gtest作为子目录并链接我的可执行文件.我构建了一个最小的例子:
cmake_minimum_required(VERSION 2.6.4)
project(MyProject)
enable_testing()
add_subdirectory( googletest )
# this sets the output dir to /bin
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
include_directories(${CMAKE_SOURCE_DIR}/googletest/include)
add_executable(myExe main.cpp)
target_link_libraries(myExe gtest_main gtest)
Run Code Online (Sandbox Code Playgroud)
最后三行设置googletest的包含路径,添加可执行文件并将exe链接到gtest.
下载gtest并创建cmake结构后,您可以构建程序:
$ mkdir bin
$ cd bin
$ cmake ..
$ make
Run Code Online (Sandbox Code Playgroud)
并调用exe:
$ ./myExe
Run Code Online (Sandbox Code Playgroud)
我希望这将有所帮助.
最后,我找到了如何在不添加googletest作为子项目的情况下重建静态libgtest.a.
我的项目/测试/ CMakeLists.txt的有趣部分:
.....
# Locate GTest
#find_package(GTest REQUIRED)
#include_directories(SYSTEM ${GTEST_INCLUDE_DIRS})
set(GTEST_SRC /usr/src/gtest/src/gtest-all.cc)
include_directories(SYSTEM /usr/src/gtest # <-- path to non-header files from gtest-all.cc
/usr/include) # <-- path to gtest headers
add_library(gtest STATIC ${GTEST_SRC}) # <-- make static library target before main project executable
target_link_libraries(gtest ${CMAKE_THREAD_LIBS_INIT})
# Link runTests with what we want to test and the GTest and pthread library
add_executable(tests ${SRC})
target_link_libraries(tests ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} gtest) # <-- finaly link this library as others
Run Code Online (Sandbox Code Playgroud)