最近、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 ライブラリに正常にリンクしていないことを意味していると思います。デバッグ ライブラリにリンクするときに、デバッグ モードでビルドするようにしました。
編集
さらに調査した結果、問題は gtest をビルドしているライブラリの種類に関係していると思います。CMake で gtest をビルドするときに、がBUILD_SHARED_LIBS
チェックされていない場合、これらの .lib ファイルに対してプログラムをリンクすると、上記のエラーが発生します。ただし、BUILD_SHARED_LIBS
がチェックされている場合は、.lib ファイルと .dll ファイルのセットが生成されます。これらの .lib ファイルに対してリンクすると、プログラムはコンパイルされますが、実行すると gtest.dll が見つからないというエラーが表示されます。
SHARED
ライブラリと非共有ライブラリの違いは何ですか?SHARED
また、共有しないことを選択した場合、なぜ機能しないのですか? 私のプロジェクトの CMakeLists.txt に、見落としているオプションがありますか?
ベストアンサー1
解決策としては、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 )