构建谷歌测试像共享库

问题描述:

我有许多子项目的项目,其中之一是谷歌测试项目。 每次构建主项目时,我都必须将Google测试库构建为共享库,但单独构建Google测试的共享方式是设置全局选项“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) 

但没有效果。

+0

[使用GTest和GMock进行测试:共享与静态库](http://*.com/questions/21237341/testing-with-gtest-and-gmock-shared-vs-static-libraries) –

+0

SHARED的引号是什么? – usr1234567

两种可能性:如果你不能随意改变GTEST源,设置add_subdirectory呼吁GTEST前BUILD_SHARED_LIBS选项,之后立即重置回:

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_*宏设置some additional stuff为平原add_library会错过的构建。

请注意,您可能仍然希望将gtest_main保存为静态库,因为它为程序定义了入口点(也称为main()),并将其移至共享库可能没有您想要的效果。

+0

第一个工作适合我。但是第二次产生链接器错误。 – voltento

+0

@voltento什么链接错误?如果您在运行时函数中发生冲突,则可能必须在Windows上设置'gtest_force_shared_crt',否则,它应该也能正常工作。无论如何,第一种解决方案可能是可取的,因为它不那么具有侵入性。 – ComicSansMS

将变量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策略处理具有相同名称的普通变量和缓存变量。