2017-03-07 71 views
1

我有許多子項目的項目,其中之一是谷歌測試項目。 每次構建主項目時,我都必須將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) 

但沒有效果。

+0

[使用GTest和GMock進行測試:共享與靜態庫](http://stackoverflow.com/questions/21237341/testing-with-gtest-and-gmock-shared-vs-static-libraries) –

+0

SHARED的引號是什麼? – usr1234567

回答

1

兩種可能性:如果你不能隨意改變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()),並將其移至共享庫可能沒有您想要的效果。

+0

第一個工作適合我。但是第二次產生鏈接器錯誤。 – voltento

+0

@voltento什麼鏈接錯誤?如果您在運行時函數中發生衝突,則可能必須在Windows上設置'gtest_force_shared_crt',否則,它應該也能正常工作。無論如何,第一種解決方案可能是可取的,因爲它不那麼具有侵入性。 – ComicSansMS

1

將變量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策略處理具有相同名稱的普通變量和緩存變量。