GoogleのC++テストフレームワークには2つの出力ライブラリがあります。1つはgtest.libで、もう1つはgtest_main.libです。 Nik Reimanの回答 on Visual Studioでgtestをセットアップする方法 によると、gtest_main.libにリンクする必要がありますが、gtest.libとそのサンプルテストケースにリンクしています。私は元気に走っています。
2つのライブラリの違いは何ですか?どちらにリンクするかは重要ですか?
唯一の合理的な違いは、gtest_main.libがテストアプリケーションのエントリポイント(つまり、main
関数)のデフォルトの実装を提供することです。
Google C++テストフレームワーク入門 からの引用:
「[...]これらすべてのmain()関数を書くのは大変な作業だと思うかもしれませんか?私たちはあなたに完全に同意します。そのため、Google Testはmain()の基本的な実装を提供します。ニーズに合う場合は、リンクしてください。 gtest_mainライブラリを使用したテストで、準備は完了です。」
メイン関数を自分で作成したい場合は、gtest.libにリンクする必要があります。
実際、googletestで利用できるさまざまなビルド方法では、ライブラリが一貫してビルドされません。ただし、少なくともこの部分は一貫しています。
Gtestライブラリ(プラットフォームや共有ライブラリを使用しているかどうかに応じて、_gtest.a
_、_gtest.so
_、_gtest.lib
_、_libgtest.a
_などと呼ばれます)には、次のオブジェクトコードが含まれています。テストに必要なすべてのものを含むgtestフレームワーク。基本的には、_gtest/gest.h
_から使用できるすべてのものを実装します。 main()
メソッドは含まれていません。
これには、登録されたテストを起動する簡単なmainメソッドが含まれています(1.8以降)。
_GTEST_API_ int main(int argc, char **argv) {
printf("Running main() from gtest_main.cc\n");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
_
一貫性のない部分は、_gtest_main
_が時々alsoにgtest
からのすべてが含まれるため、onlyに対してリンクする必要があるということですどちらかgtest
(独自のmain()
メソッドを作成する場合)または _gtest_main
_(上記の既定のmainメソッドを使用する場合)。これは、たとえば、 _googletest/make
_ に含まれるMakefile
ビルドを使用する場合です。
_gtest.a : gtest-all.o
$(AR) $(ARFLAGS) $@ $^
gtest_main.a : gtest-all.o gtest_main.o
$(AR) $(ARFLAGS) $@ $^
_
明らかに、_gtest_main.a
_には、_gtest.a
_が実行するすべてのものが含まれています。plusメイン関数を含む_gtest-main.o
_オブジェクト。
ただし、CMakeビルドでは、少なくとも一部のビルドアーティファクトについては状況が異なります。たとえば、メインライブラリの場合 あります :
_cxx_library(gtest "${cxx_strict}" src/gtest-all.cc)
cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)
target_link_libraries(gtest_main gtest)
_
ここで、_gtest_main
_ onlyにはmain関数が含まれ、他には何も含まれていません1。 _target_link_libraries
_行は他のことを伝えますこのCMakeビルドを使用する _gtest_main
_をリンクする場合はgtest
もリンクする必要があるため、ファイルの残りの部分では_gtest_main
_に対してのみリンクされているものを見るのが一般的です。実際、_CMakeLists.txt
_ファイルの前半のドキュメントでは、これを明示しています。
_# Defines the gtest & gtest_main libraries. User tests should link
# with one of them.
_
「1つで」の部分に注意してください。彼らが本当に意味するのは、これと同じCMakeシステムでビルドしている場合はそれを実行できるということですが、実際のリンクレベルでは、_libtest.a
_と_libgtest_main.a
_の両方が必要です。そうしないと、何も引き込まれません。テストを書く必要があります。
1 実際、CMakeではlibgtest.aは1,755,216バイトになり、libgtest_main.aはわずか3,836バイトにすぎません。 _../make/Makefile
_ビルドでは、これらの数値はそれぞれ3,365,240と3,398,356です。明らかに、含まれているファイル以外にも、Makefile
バージョンのサイズを大きくする違いがあります。