我有许多子项目的项目,其中一个是谷歌测试项目。
每次构建主项目时,我都必须将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)
但没有效果。
答案 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策略处理具有相同名称的普通变量和缓存变量。