像共享库一样构建Google Test

时间:2017-03-07 07:54:56

标签: cmake googletest

我有许多子项目的项目,其中一个是谷歌测试项目。 每次构建主项目时,我都必须将google测试库构建为共享库,但是建立Google测试共享的单一方法是设置全局选项" BUILD_SHARED_LIBS=ON"。不幸的是,其他项目依赖于此选项。那么,在这种情况下如何将google test构建为共享库?

我试图替换

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)

但没有效果。

2 个答案:

答案 0 :(得分:2)

两种可能性:如果您无权更改gtest源,请在BUILD_SHARED_LIBS调用gtest之前设置add_subdirectory选项,并在以下后立即重置:

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())并将其移动到共享库可能没有效果你想要的。

答案 1 :(得分:2)

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