建立谷歌测试一样共享库(Build Google Test like shared library)

2019-09-27 23:17发布

我有很多子项目的项目,其中之一是谷歌测试项目。 我必须在我建主体工程,而是建立在谷歌测试单一方式共享是设置全局选项“每一次打造谷歌测试库的共享库BUILD_SHARED_LIBS=ON ”。 不幸的是,其他项目都依赖这个选项。 那么,如何建立谷歌测试在这种情况下,共享库?

我试图取代

cxx_library(gtest "${cxx_strict}" src/gtest-all.cc)
cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)

add_library(gtest SHARED src/gtest-all.cc)
add_library(gtest_main "SHARED src/gtest_main.cc)

但没有效果。

Answer 1:

两种可能性:如果你不能随意改变GTEST源,设置BUILD_SHARED_LIBS的选项前add_subdirectory呼吁GTEST,紧接着又重新回来:

set(BUILD_SHARED_LIBS_OLD ${BUILD_SHARED_LIBS})
set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCED)
add_subdirectory(gtest)
set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_OLD} CACHE BOOL "" FORCED)

另外,如果你想改变GTEST源,更换cxx_library()与调用cxx_shared_library()

cxx_shared_library(gtest "${cxx_strict}" src/gtest-all.cc)   

这是必需的,因为cxx_library_*宏设置一些额外的东西,对于一个普通的构建add_library将错过。

请注意,您可能仍然要保持gtest_main作为静态库,因为它定义的入口点(也称为main()为您的程序和移动是一个共享库可能没有你想要的效果。



Answer 2:

设置可变BUILD_SHARED_LIBS步入googletest项目之前所期望的值,随后将恢复该变量。

因为googletest定义BUILD_SHARED_LIBS作为选项(即,高速缓存的变量),最好是包含googletest的前初始高速缓存的值分配给该变量。

# Need to assign value for cache variable explicitely.
option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
...
# Store old value
set(BUILD_SHARED_LIBS_OLD ${BUILD_SHARED_LIBS})
# Assign desired value for subproject
set(BUILD_SHARED_LIBS ON)
# Step into subproject
add_subdirectory(gtest)
# Restore old value
set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_OLD})

请注意,对于临时值的改变,你需要不修改缓存:只要设定正常的变量 。 这是可能的,因为具有相同名称的处理标准和高速缓存变量的CMake的政策。



文章来源: Build Google Test like shared library