1. ホーム
  2. unit-testing

[解決済み] GTestとCMakeを使った作業の始め方

2022-05-03 04:37:08

質問

最近、私のC++プロジェクトをコンパイルするためにCMakeを使用することに納得し、今、私のコードのためにいくつかのユニットテストを書き始めたいと思います。私はこれを支援するためにGoogle Testユーティリティを使用することを決定しましたが、開始する際にいくつかの助けを必要とします。

一日中、様々なガイドと例を読んでいましたが、その中に 入門編 という IBMでの紹介 とSOに関するいくつかの質問( こちら こちら ) や他のソースは分からなくなりました。たくさんあるのは分かっているのですが、なぜかまだ困っています。

現在、gtestを正しくコンパイル/インストールしたことを確認するために、最も基本的なテストを実装しようとしているのですが、うまくいきません。唯一のソースファイル(testgtest.cpp)は、ほぼ正確に以下から取得されています。 これ 前回の回答

#include <iostream>

#include "gtest/gtest.h"

TEST(sample_test_case, sample_test)
{
    EXPECT_EQ(1, 1);
}

で、私の関連するCMakeLists.txtは以下の通りです。

cmake_minimum_required(VERSION 2.6)
project(basic_test)

# Setup testing
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIR})

# Add test cpp file
add_executable(runUnitTests
    testgtest.cpp
)

# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})

add_test(
    NAME runUnitTests
    COMMAND runUnitTests
)

cppファイルの最後にmainを提供する代わりに、gtest_mainに対してリンクすることを選択したことに注意してください。

生成された .sln ファイルを (Visual C++ 2010 Express で) ビルドすると、残念ながら次のようなエラーの長いリストが表示されます。

2>msvcprtd.lib(MSVCP100D.dll) : error LNK2005: "public: virtual __thiscall std::basic_iostream<char,struct std::char_traits<char> >::~basic_iostream<char,struct std::char_traits<char> >(void)" (??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ) already defined in gtestd.lib(gtest-all.obj)

というのは、gtest ライブラリへのリンクがうまくいっていないのだと思います。デバッグ・ライブラリにリンクする際に、デバッグ・モードでビルドすることを確認しました。

EDIT

もう少し調べてみると、私の問題は、私がgtestをビルドしているライブラリの種類と関係があるようです。CMakeでgtestをビルドするとき、もし BUILD_SHARED_LIBS がチェックされておらず、これらの .lib ファイルに対して私のプログラムをリンクすると、上記のようなエラーが発生します。しかし、もし BUILD_SHARED_LIBS をチェックすると、.lib と .dll ファイルのセットが作成されます。これらの.libファイルに対してリンクすると、プログラムはコンパイルされますが、実行するとgtest.dllが見つからないと文句を言われます。

の違いは何ですか? SHARED とは異なり SHARED ライブラリで、not shared を選択した場合、なぜ動作しないのでしょうか?私のプロジェクトのためのCMakeLists.txtに私が見逃しているオプションがありますか?

解決方法は?

gtestのソースディレクトリをプロジェクトのサブディレクトリとして配置することで解決しました。もし誰かの参考になるのであれば、動作中のCMakeLists.txtを下に載せておきます。

cmake_minimum_required(VERSION 2.6)
project(basic_test)

################################
# GTest
################################
ADD_SUBDIRECTORY (gtest-1.6.0)
enable_testing()
include_directories(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})

################################
# Unit Tests
################################
# Add test cpp file
add_executable( runUnitTests testgtest.cpp )
# Link test executable against gtest & gtest_main
target_link_libraries(runUnitTests gtest gtest_main)
add_test( runUnitTests runUnitTests )