构建 Google 像共享库一样测试

Build Google Test like shared library

我的项目有很多子项目,其中之一是 google 测试项目。 每次构建主项目时,我都必须构建 google 测试库作为共享库,但是将 google 测试构建为共享的唯一方法是设置全局选项“BUILD_SHARED_LIBS=ON”。不幸的是,其他项目依赖于此选项。那么,在这种情况下如何构建 google 测试作为共享库?

我尝试替换

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)

但是没有效果

两种可能性:如果您不能随意更改 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_* 宏为普通 add_library 会错过的构建设置 some additional stuff

请注意,您可能仍希望将 gtest_main 保留为静态库,因为它为您的程序定义了入口点(又名 main()),将其移动到共享库可能不会您想要的效果。

在进入 googletest 项目之前将变量 BUILD_SHARED_LIBS 设置为所需的值,然后恢复该变量。

因为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 处理同名的普通变量和缓存变量的策略。