[解決済み] GTestとCMakeを使った作業の始め方
質問
最近、私の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 )
関連
-
[解決済み] Moqでクラスをモックするとき、特定のメソッドだけをCallBaseする方法は?
-
[解決済み] フェイク、モッキング、スタビングの違いとは?
-
[解決済み] Gradleを使用して1つのユニットテストクラスのみを実行する方法
-
[解決済み] プライベートメソッドをテストすべきか、パブリックメソッドのみをテストすべきか?[クローズド]
-
[解決済み】ユニットテストと機能テストの違いは何ですか?
-
[解決済み】ユニットテストとは何ですか?[クローズド]
-
[解決済み] Goのモック関数
-
[解決済み] CMake:ユニットテストによるプロジェクト構造
-
[解決済み] 既存のプロダクションプロジェクトにユニットテストをうまく追加することができますか?もしそうなら、どのように、そして、それは価値があるのでしょうか?
-
[解決済み] ユニットテストとは、どのようなもので、どのように行うのですか?[重複あり]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン