我有很多子项目的项目,其中之一是谷歌测试项目。 我必须在我建主体工程,而是建立在谷歌测试单一方式共享是设置全局选项“每一次打造谷歌测试库的共享库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)
但没有效果。
两种可能性:如果你不能随意改变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()
为您的程序和移动是一个共享库可能没有你想要的效果。
设置可变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的政策。