构建 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 处理同名的普通变量和缓存变量的策略。
我的项目有很多子项目,其中之一是 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 处理同名的普通变量和缓存变量的策略。