web-dev-qa-db-ja.com

gtest.libとgtest_main.libの違いは何ですか?

GoogleのC++テストフレームワークには2つの出力ライブラリがあります。1つはgtest.libで、もう1つはgtest_main.libです。 Nik Reimanの回答 on Visual Studioでgtestをセットアップする方法 によると、gtest_main.libにリンクする必要がありますが、gtest.libとそのサンプルテストケースにリンクしています。私は元気に走っています。

2つのライブラリの違いは何ですか?どちらにリンクするかは重要ですか?

29
Kiril

唯一の合理的な違いは、gtest_main.libがテストアプリケーションのエントリポイント(つまり、main関数)のデフォルトの実装を提供することです。

Google C++テストフレームワーク入門 からの引用:

「[...]これらすべてのmain()関数を書くのは大変な作業だと思うかもしれませんか?私たちはあなたに完全に同意します。そのため、Google Testはmain()の基本的な実装を提供します。ニーズに合う場合は、リンクしてください。 gtest_mainライブラリを使用したテストで、準備は完了です。」

メイン関数を自分で作成したい場合は、gtest.libにリンクする必要があります。

23
Andrey

実際、googletestで利用できるさまざまなビルド方法では、ライブラリが一貫してビルドされません。ただし、少なくともこの部分は一貫しています。

gtest

Gtestライブラリ(プラットフォームや共有ライブラリを使用しているかどうかに応じて、_gtest.a_、_gtest.so_、_gtest.lib_、_libgtest.a_などと呼ばれます)には、次のオブジェクトコードが含まれています。テストに必要なすべてのものを含むgtestフレームワーク。基本的には、_gtest/gest.h_から使用できるすべてのものを実装します。 main()メソッドは含まれていません

gtest_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_が時々alsogtestからのすべてが含まれるため、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バージョンのサイズを大きくする違いがあります。

3
BeeOnRope