如何从我的项目 CMakeLists.txt 构建 gtest 静态库?

How to build gtest static library from my project CMakeLists.txt?

我有一个主 项目 和一个子项目 tests。 在 project/CMakeLists.txt 我添加了

add_subdirectory(tests)

project/tests/CMakeLists.txt 中,我插入 "pre-compiled" gtest 库(来自 Ubuntu 存储库)。我cd到/usr/src/gtest编译两个*.a文件到系统lib目录下。 它工作正常,直到 google test FAQ 中描述的问题出现。

如何从 project/tests/CMakeLists.txt 构建 gtest 静态库文件以及如何使用这个新的 *.a 文件而不是系统文件?

我从头开始。 首先,从

下载googletest源代码

https://github.com/google/googletest

当我们下载这个 ZIP-files 时,我们得到了 googletest 和 googlemock 项目,但这里我将只使用 googletest 文件夹。我解压 ZIP 并将 googletest 文件夹复制到我的项目中,例如:

/home/name/myProject/ 

此文件夹中的内容可能如下所示:

- CMakeLists.txt
- googletest /
- main.cpp

在 CMakeList 文件中,我可以将 gtest 添加为子目录,并 link 我的可执行文件针对它。我建立了一个最小的例子:

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)

最后三行设置 googletest 的包含路径,添加可执行文件和 link 针对 gtest 的 exe。
下载 gtest 并创建 cmake 结构后,您可以构建您的程序:

$ mkdir bin
$ cd bin
$ cmake ..
$ make

并调用exe:

$ ./myExe

希望对您有所帮助。

最后我找到了如何在不将 googletest 添加为子项目的情况下重建静态 libgtest.a

使用来自 this link and from the bottom of this link.

的信息

我的 project/tests/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