2017-03-07 9 views
1

私は多くのサブプロジェクトを持つプロジェクトを持っており、そのうちの1つはGoogleテストプロジェクトです。 私はメインプロジェクトをビルドするたびに共有ライブラリとしてGoogleテストライブラリをビルドする必要がありますが、共有としてGoogleテストを構築する単一の方法はグローバルオプション "BUILD_SHARED_LIBS=ON"を設定しています。残念ながら、このオプションには他のプロジェクトが依存しています。だから、どのようにGoogleのテストを共有ライブラリとしてこの場合に構築する?Googleテストを共有ライブラリのように構築する

私は

add_library(gtest SHARED src/gtest-all.cc) 
add_library(gtest_main "SHARED src/gtest_main.cc) 

cxx_library(gtest "${cxx_strict}" src/gtest-all.cc) 
cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc) 

を交換しようとしたが、それは何の効果ではありません。

+0

[GTestとGMockによるテスト:共有ライブラリと静的ライブラリ](http://stackoverflow.com/questions/21237341/testing-with-gtest-and-gmock-shared-vs-static-libraries)の可能な複製 –

+0

gefore SHAREDとは何ですか? – usr1234567

答えて

1

2つの可能性:あなたは自由ではない場合、GTESTソースを変更GTESTためadd_subdirectory呼び出しの前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) 

cxx_library_*マクロはsome additional stuffを設定するため、これが必要な

cxx_shared_library(gtest "${cxx_strict}" src/gtest-all.cc) 

:GTESTソースを変更するには、cxx_shared_library()への呼び出しでcxx_library()を置き換えます普通のadd_libraryが欠けているビルドのために。

gtest_mainは静的ライブラリにしておきます。プログラムのエントリポイント(別名main())を定義し、それを共有ライブラリに移動すると意図した効果が得られない可能性があります。

+0

最初はうまく動作します。しかし、2番目のリンカーエラーが生成されます。 – voltento

+0

@voltentoどのリンカーエラーですか?ランタイム関数の競合が発生した場合は、Windows上で 'gtest_force_shared_crt'を設定する必要があるかもしれませんが、それ以外の場合はうまくいくはずです。いずれにせよ、第1の解決策はおそらく、侵入性が低いので、おそらく好ましい。 – ComicSansMS

1

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ポリシーのために可能です。

関連する問題