2016-07-02 3 views
0

私はGoogle C++ Testingを使用したいと思います。私は完全に初心者でcmakeとgtestです。CmakeとGtest

私は、janeと呼ばれる3Dパーティライブラリを使用するFilterというクラスを持っています。この場合の

私は次のようにきれいに私のプロジェクトをビルドしますcmakeFileを持っている:

cmake_minimum_required(VERSION 3.1.2) 
project(Filter) 
include(../../../cmake/CMakeMacros.txt) 
set_variables() 
#add 3rdparty libraries 
add_jane() 
#add framework libraries 
add_framework_libs(
ip/Image 
) 
include_directories(
../include 
${FW_INCLUDE_DIRS} 
) 

#set project's source and include files 
set(INCS 
../include/${PROJECT_NAME}.h 
../include/${PROJECT_NAME}.tpp 
../include/FilterMask.h 
) 

set(SRCS 
../src/${PROJECT_NAME}.cpp 
../src/FilterMask.cpp 
) 

#set link directories 
link_directories(
${FW_LIBRARY_DIRS} 
) 

#build project as static library (*.lib) 
add_library(${PROJECT_NAME} STATIC 
${INCS} 
${SRCS} 
) 
#link libraries against project 
target_link_libraries(${PROJECT_NAME} 
${FW_LIBRARIES} 
) 

#if a test executable should be build 
if(Test_BUILD_EXAMPLES) 
#build test executable 
add_executable(${PROJECT_NAME}Test 
    ../src/main.cpp 
) 
#link library against executable 
target_link_libraries(${PROJECT_NAME}Test 
    ${PROJECT_NAME} 
) 
endif(Test_BUILD_EXAMPLES) 

とも私は、このcmakeのファイルhttps://github.com/snikulov/google-test-examples/blob/master/CMakeLists.txthttps://github.com/snikulov/google-test-examplesにこの簡単なチュートリアルを読んで、組み合わせて、再び私のプロジェクトをビルドしようとしていますこれらのcmakeファイルは一緒に(非常にばかげた方法であるかもしれませんが)私はそれを達成できません。

問題は、ヘッダーファイルだけで単純なプロジェクトをテストする場合、このcmakeファイルを使用できますが、サードパーティ製のライブラリを含むプロジェクトをテストしようとすると、別のエラーが発生します。

誰かが私はcmakeのファイルを使用してgoogleTestと私のプロジェクトをテストするために、正しいcmakeのファイルを編集する方法を教えていただけますか!?

+0

あなたがチェックアウトすることをお勧めします[この回答](HTTP: // tackoverflow.com/a/31622855/1938798)、このチュートリアルのメソッドではなく、ビルドにgtestを取り込む代わりの方法があります。回答のリンク先の記事には、githubに関するプロジェクトもあります。あなたのリンク問題に関しては、実際のエラーを示した場合、根本的な問題のより具体的な診断が可能になります。あなたのプロジェクトがプロジェクトの外のディレクトリからすべてのソースなどを引き出しているように見えるのは、かなり奇妙です。 –

答えて

1

あなたがサードパーティのライブラリをリンクしたい場合は、通常、最初:

  1. find_package()またはライブラリをチェックするPKGの設定のサポートを使用するには、ビルドホスト上で利用可能であり、それへの参照を拾います。
  2. は、だから、あなたはサードパーティ製のlibにのために何をする必要があるかだtarget_link_libraries()

のステップ#1からの参照を含めます。テストの対象となるあなた自身のコードのために、あなた自身のライブラリの中にすべて入れて、それらのテストとリンクさせたいと思うかもしれません。

&を個別のバイナリに分離するための複数のテスト実行ファイルがある場合、テストスイート内のコードをテスト対象の実際のユニットに制限するオーバーライドを避ける代替テクニックが必要です。 (これは、コードベースがフラックスになっていて部分的にビルドするときにも非常に便利ですが、ビルドしているビルドが引き続き関連するテストに合格していることを確認したい場合)。

この場合、テスト対象のユニットをこれらのオブジェクトライブラリに対してtarget_link_libraries()を実行する代わりに、$<TARGET_OBJECTS:NameOfObjLibHere>(cmakeジェネレータ式)を使用して、実行可能ファイルのソースの一部としてオブジェクトをインクルードします。

ので、サードパーティ製のlibに依存単位の場合は、言って、Qt5コアは、次のようなスニペットを持っていると思います:

# define the dependency on 3rd party project Qt5, (sub)component: Core, Test) 
set(MY_QT_VERSION "5.4.0") 
find_package(Qt5 ${MY_QT_VERSION} REQUIRED COMPONENTS Core CONFIG) 

# define the object lib for a unit to be tested (Item1) 
set(item1_srcs item1.cpp util1.cpp) 
add_library(Item1 TYPE OBJECT ${item1_srcs}) 

# ensure that necessary compiler flags are passed 
# when building "Item1" separately 
# note that PRIVATE may also be INTERFACE or PUBLIC 
# read the cmake docs on target_include_*** to determine which applies. 
# you probably want to hide this behind a convenience macro. 
target_include_directories(Item1 PRIVATE $<TARGET_PROPERTY:Qt5::Core,INTERFACE_INCLUDE_DIRECTORIES>) 
target_compile_options(Item1 PRIVATE $<TARGET_PROPERTY:Qt5::Core,INTERFACE_COMPILE_OPTIONS>) 

# find the unit testing framework (dependency) 
# this sample uses Qt5 Test (Qt5::Test) but you could use GTest, too 
find_package(Qt5 ${MY_QT_VERSION} REQUIRED COMPONENTS Test CONFIG) 

# define an executable which contains test sources + unit under test 
# link against the testing framework (obviously) as per normal 
# note the Qt5::Core dependency here: remember Item1 depends on Qt5::Core (!) 
set(test_item1_srcs, test_item1.cpp $<TARGET_OBJECTS:Item1>) 
add_executable(test_item1 ${test_item1_srcs) 
target_link_libraries(test_item1 Qt5::Core Qt5::Test) 

# inform cmake/ctest integration about our test 
# so it knows to execute it during `make test` phase. 
# and other cmake/ctest integration falls into place as well, possibly 
add_test(test_item1 test_item1)