构建谷歌测试像共享库
我有许多子项目的项目,其中之一是谷歌测试项目。 每次构建主项目时,我都必须将Google测试库构建为共享库,但单独构建Google测试的共享方式是设置全局选项“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源,设置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_*
宏设置some additional stuff为平原add_library
会错过的构建。
请注意,您可能仍然希望将gtest_main
保存为静态库,因为它为程序定义了入口点(也称为main()
),并将其移至共享库可能没有您想要的效果。
第一个工作适合我。但是第二次产生链接器错误。 – voltento
@voltento什么链接错误?如果您在运行时函数中发生冲突,则可能必须在Windows上设置'gtest_force_shared_crt',否则,它应该也能正常工作。无论如何,第一种解决方案可能是可取的,因为它不那么具有侵入性。 – ComicSansMS
将变量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策略处理具有相同名称的普通变量和缓存变量。
[使用GTest和GMock进行测试:共享与静态库](http://*.com/questions/21237341/testing-with-gtest-and-gmock-shared-vs-static-libraries) –
SHARED的引号是什么? – usr1234567